blaze persistence save embeddedId view

30 views Asked by At

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);
    });
0

There are 0 answers