JPA OneToMany使用DiscriminatorOptions和orphanremoval继承实体

时间:2011-10-17 13:23:07

标签: hibernate jpa one-to-many single-table-inheritance discriminator

我有一个问题,我现在几天都无法解决。我阅读了很多文档,搜索了许多论坛,但没有找到解决方案。 我继承了类,代码如下所示:

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "nc_linktype", discriminatorType = DiscriminatorType.STRING)
@Table(name = "mk_newsletter_coupons")
@DiscriminatorOptions(force = true)
public class BaseNewsletterCoupon extends BaseEntity {...}

@Entity
@DiscriminatorValue("expire")
public class NewsletterCouponsExpire extends BaseNewsletterCoupon {

@Entity
@DiscriminatorValue("region")
public class NewsletterCouponsRegion extends BaseNewsletterCoupon {

我想在OneToMany看法的许多方面使用这些特定实体:

@Entity(name = "newsletter")
@Table(name = "mk_newsletters")
@Configurable
public class NewsLetter extends BasePictureEntity {

    @OneToMany(mappedBy = "newsletter", cascade = { CascadeType.ALL }, orphanRemoval = true, fetch = FetchType.LAZY)
    @IndexColumn(name = "nc_index")
    @OrderColumn(name = "nc_index")
    @OrderBy("index")
    List<NewsletterCouponsExpire> expireCoupons = new ArrayList<NewsletterCouponsExpire>();

    @OneToMany(mappedBy = "newsletter", cascade = { CascadeType.ALL }, orphanRemoval = true, fetch = FetchType.LAZY)
    @IndexColumn(name = "nc_index")
    @OrderColumn(name = "nc_index")
    @OrderBy("index")
    List<NewsletterCouponsRegion> regionCoupons = new ArrayList<NewsletterCouponsRegion>();

当我坚持这个简报实体时,所有记录都很好地创建。 如果我修改列表的内容,似乎orphanRemoval = true属性没有效果,因为旧记录保留在表中,并且创建了新记录。 如果从基本实体中删除@DiscriminatorOptions批注,旧记录将被删除,但继承鉴别符不再起作用,因此JPA提供程序(hibernate)会尝试将每个子记录加载到每个集合中,这会导致组织.hibernate.loader.Loader.instanceAlreadyLoaded exception。

是否有人成功实施过这样的模型,或者知道此问题的解决方法?

1 个答案:

答案 0 :(得分:0)

您可以尝试使用Hibernate的原生@Cascade注释与级联删除孤立,而不是JPA的孤儿删除。 它有可能发挥作用。

让我知道它是否适合你。