Отдельная сущность передана для сохранения при использовании Composite Key с объектами

user2116499 спросил: 13 октября 2017 в 07:46 в: java

У меня проблемы с сохранением сущности, к которой прикреплены дочерние объекты. Следующий код выдает "org.hibernate.PersistentObjectException: отдельная сущность, переданная в persist: nl.test.api.domain.attribute.Attribute" при попытке сохранить сущность Ad, зная, что в ее дочернем объектном поле есть Cascade.ALL , Важно отметить, что я использую IdClass для составного первичного ключа и использую объекты Ad и Attribute как части составного первичного ключа AdAttribute.

Я понимаю, что означает исключение, но в любом случае я не могу чтобы исправить это, особенно потому, что метод создания является транзакционным. Есть мысли?

Корневой объект / объект Ad:

@Entity
@DynamicInsert
@DynamicUpdate
@Table(name = "ad")
public class Ad implements SearchableAdDefinition {    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, optional = false)
    private User user;    @OneToMany(mappedBy = "ad", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    private Set<AdAttribute> adAttributes;(...)
}

"Дочерний объект" (который содержит составной ключ, частью которого являются объекты @ManyToOne ключ)

@Entity
@Table(name = "attrib_ad")
@IdClass(CompositeAdAttributePk.class)
public class AdAttribute {    @Id
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "ad_id")
    private Ad ad;    @Id
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "attrib_id")
    private Attribute attribute;    @Column(name = "value", length = 75)
    private String value;    public Ad getAd() {
        return ad;
    }    public void setAd(Ad ad) {
        this.ad = ad;
    }    public Attribute getAttribute() {
        return attribute;
    }    public void setAttribute(Attribute attribute) {
        this.attribute = attribute;
    }    public String getValue() {
        return value;
    }    public void setValue(String value) {
        this.value = value;
    }
} class CompositeAdAttributePk implements Serializable {
    private Ad ad;
    private Attribute attribute;    public CompositeAdAttributePk() {    }    public CompositeAdAttributePk(Ad ad, Attribute attribute) {
        this.ad = ad;
        this.attribute = attribute;
    }    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        CompositeAdAttributePk compositeAdAttributePk = (CompositeAdAttributePk) o;
        return ad.getId().equals(compositeAdAttributePk.ad.getId()) && attribute.getId().equals(compositeAdAttributePk.attribute.getId());    }    @Override
    public int hashCode() {
        return Objects.hash(ad.getId(), attribute.getId());
    }

И, наконец, метод, которым я создаю родительский объект (Ad) и прикрепляю дочерние объекты (атрибуты Ad):

@Transactional
public Ad create(String title, User user, Category category, AdStatus status, String description, String url, Double price, AdPriceType priceType, Integer photoCount, Double minimumBid, Integer options, Importer importer, Set<AdAttribute> adAttributes) {    Ad ad = new Ad();    ad.setTitle(title);
    ad.setUser(user);
    ad.setCategory(category);
    ad.setStatus(status);
    ad.setDescription(description);
    ad.setUrl(url);
    ad.setPrice(price);
    ad.setPriceType(priceType);
    ad.setPhotoCount(photoCount);
    ad.setMinimumBid(minimumBid);
    ad.setOptions(options);
    ad.setImporter(importer);
    ad.setAdAttributes(adAttributes);    for (AdAttribute adAttribute : ad.getAdAttributes()) {
        adAttribute.setAd(ad);
    }    ad = adRepository.save(ad);    solrAdDocumentRepository.save(AdDocument.adDocumentBuilder(ad));    return ad;
}

0 ответов