I need to save entityview, entity that has a composed primary key, in hibernate with @EmbeddableId.
@Entity
@Table(name = "articles_images")
public class ArticleImageEntity {
@EmbeddedId
private ArticleImageId id;
@ManyToOne
@MapsId("articleId")
@JoinColumn(name = "article_id")
private ArticleEntity articleEntity;
@ManyToOne
@MapsId("imageId")
@JoinColumn(name = "image_id")
private ImageEntity imageEntity;
}
@Embeddable
public class ArticleImageId implements Serializable {
@Column(name = "article_id")
private Long articleId;
@Column(name = "image_id")
private UUID imageId;
}
EntityView look like
@CreatableEntityView
@UpdatableEntityView
@EntityView(ArticleImageEntity.class)
public interface ArticleImageView {
@IdMapping
ArticleImageIdView getId();
@Mapping(value = "imageEntity", fetch = FetchStrategy.SELECT)
ImageView getImage();
@Mapping(value = "articleEntity", fetch = FetchStrategy.SELECT)
ArticleView getArticle();
// setters
@EntityView(ArticleImageId.class)
public interface ArticleImageIdView {
Long getArticleId();
UUID getImageId();
}
If I save an array of one item, then there are no exceptions and the object is saved, and if there are two, an error is thrown.
I tried all the save methods but always got an exception like:
java.lang.IllegalStateException: Parent object for ArticleView(id = 2) is already set to ArticleImageUpdatableView(id = ArticleImageIdView(articleId = null, imageId = null)) and can't be set to: ArticleImageUpdatableView(id = ArticleImageIdView(articleId = null, imageId = null))
Сode snippet to save
ArticleView articleView = articleRepo.findById(id);
List<ImageView> imageViews = imageService.save(uploadImages, ImageKeys.ARTICLES);
IntStream.range(0, imageViews.size())
.forEach(idx -> {
ArticleImageUpdatableView articleImageView = evm.create(ArticleImageUpdatableView.class);
articleImageView.setImage(imageViews.get(idx));
articleImageView.setArticle(articleView);
articleImageView.setOrdering(uploadImages.get(idx).getOrdering());
evm.save(em, articleImageView);
});