5

ここ数日解決できない問題があります。多くのドキュメントを読み、多くのフォーラムを検索しましたが、解決策が見つかりませんでした。コードが以下に示すように、クラスを継承しました。

@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 realions の多くの側でこれらの特定のエンティティを使用したいと思います。

@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.loader.Loader.instanceAlreadyLoaded 例外。

このようなモデルの実装に成功した人はいますか、またはこの問題の回避策を知っていますか?

4

1 に答える 1

0

JPA のオーファン削除の代わりに、カスケード削除オーファンで Hibernate のネイティブ @Cascade アノテーションを使用してみることができます。うまくいく可能性はあります。

うまくいったかどうか教えてください。

于 2013-03-18T11:02:02.370 に答える