Ошибка временного экземпляра аннотации @ManyToAny для Cascade.All - PullRequest
0 голосов
/ 28 мая 2020

У меня модель домена ниже. Я добавил сущности специализации как Product, так и ProductDetail с аннотацией @ManyToAny. Кроме того, сущность Product имеет много сущностей ProductDetail.

Я хочу сохранить новую сущность Product с одной из ее специализаций и productDetails (также с одной из ее специализаций).

Я использую метод merge() для нового Product процесса сохранения, но он вызывает ошибку:

org.hibernate.TransientObjectException: объект ссылается на несохраненный временный экземпляр - сохраните временный экземпляр перед промывкой: com.test.model.FlyingProductDetailSpecialization.

Я искал эту проблему, но не нашел ничего, отличного от ответов на CascadeType.ALL. Я использовал этот каскадный тип.

Если я использую метод persist() для нового процесса сохранения Product, результат будет успешным. Но если я хочу обновить эту Product сущность (с помощью метода merge ()), добавив productDetail с ее специализациями, то же самое TransientObjectException также произойдет.

Есть ли у вас какие-либо представления об этом проблема? Спасибо.

(BaseObject класс имеет столбцы createDate, updateDate, id. Я не добавляю этот класс для сокращения вопроса.)

// Product Model
@Table(name="product")
@Entity
public class Product extends BaseObject{

   @OneToMany(mappedBy="product", cascade=CascadeType.ALL, orphanRemoval=true)
   @LazyCollection(LazyCollectionOption.FALSE)
   @JsonIgnoreProperties(value="product", allowSetters=true)
   private List<ProductDetail> productDetails = new ArrayList<>();

   @ManyToAny(metaDef="ProductSpecMetaDef", metaColumn=@Column(name="product_specialization_type"))
   @LazyCollection(LazyCollectionOption.FALSE)
   @Cascade(org.hibernate.annotations.CascadeType.ALL)
   @JoinTable(
     name="product_specialization_relationship",
     joinColumns=@JoinColumn(name="product"),
     inverseJoinColumns=@JoinColumn(name="product_specialization")
   )
   private List<ISpecialization<Product>> productSpecializations = new ArrayList<>();

   // and some string and numerical fields
}

@Table(name="unused_product_specialization")
@Entity
public class UnusedProductSpecialization extends BaseObject implements ISpecialization<Product>{

   // some string and numerical fields
}

@Table(name="used_product_specialization")
@Entity
public class UsedProductSpecialization extends BaseObject implements ISpecialization<Product>{

   // some string and numerical fields
}

// package-info definition for ManyToAny relationship
@AnyMetaDef(name="ProductSpecMetaDef", metaType="string", idType="string",
            metaValues= {@MetaValue(value = "Unused", targetEntity=UnusedProductSpecialization.class),
                         @MetaValue(value = "Used", targetEntity=UsedProductSpecialization.class)
            })
// End of Product Model


// Product Detail Model
@Table(name="product_detail")
@Entity
public class ProductDetail extends BaseObject{

   @ManyToOne
   @JoinColumn(name="product",referencedColumnName="id",nullable=false, foreignKey=@ForeignKey(name="product_detail_product_fkey"))
   @JsonIgnoreProperties(value="productDetails", allowSetters=true)
   private Product product;

   @ManyToAny(metaDef="ProductDetailSpecMetaDef", metaColumn=@Column(name="product_detail_specialization_type"))
   @LazyCollection(LazyCollectionOption.FALSE)
   @Cascade(org.hibernate.annotations.CascadeType.ALL)
   @JoinTable(
     name="product_detail_specialization_relationship",
     joinColumns=@JoinColumn(name="product_detail"),
     inverseJoinColumns=@JoinColumn(name="product_detail_specialization")
   )
   private List<ISpecialization<ProductDetail>> productDetailSpecializations = new ArrayList<>();

   // and some string and numerical fields
}

@Table(name="flying_product_detail_specialization")
@Entity
public class FlyingProductDetailSpecialization extends BaseObject implements ISpecialization<ProductDetail>{

   // some string and numerical fields
}

@Table(name="walking_product_detail_specialization")
@Entity
public class WalkingProductDetailSpecialization extends BaseObject implements ISpecialization<ProductDetail>{

   // some string and numerical fields
}

// package-info definition for ManyToAny relationship
@AnyMetaDef(name="ProductDetailSpecMetaDef", metaType="string", idType="string",
            metaValues= {@MetaValue(value = "Flying", targetEntity=FlyingProductDetailSpecialization.class),
          @MetaValue(value = "Walking", targetEntity=WalkingProductDetailSpecialization.class)
            })
// End of Product Detail Model
...