3 つのコレクションを保持するオブジェクトがあります。これらのコレクション内のオブジェクトは、同じスーパークラスから継承されます。
@ForceDiscriminator で SingleTable 継承を使用します。
コレクションは一方向の一対多です。
これらのコレクションの 1 つをクリアすると、他の 2 つのコレクションは保持オブジェクトへの外部キー リンクを失います。
WebSphere 7 (JPA2.0 フィーチャー・パックを使用) コンテナーで Hibernate 3.5.3 を使用しています。
エンティティ
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@Table(name="PLANUNG")
@DiscriminatorColumn(name="DISC", discriminatorType=DiscriminatorType.STRING)
@DiscriminatorValue("dummy")
@ForceDiscriminator
public abstract class Planung extends EntityBase {
@Column(name = "JAHR", nullable=false)
private int jahr;
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch=FetchType.EAGER)
@JoinColumn(name="PLANUNG_ID", referencedColumnName="id")
@OrderBy("id ASC")
private List<Werte> Werte;
[...]
@Entity
@DiscriminatorValue(PlanungA.NAME)
public class PlanungA extends Planung {
public static final String NAME = "PlanungA";
}
@Entity
@DiscriminatorValue(PlanungB.NAME)
public class PlanungB extends Planung {
public static final String NAME = "PlanungB";
}
@Entity
@DiscriminatorValue(PlanungC.NAME)
public class PlanungC extends Planung {
public static final String NAME = "PlanungC";
}
---
@Entity
@DiscriminatorValue(Base.NAME)
public class Base extends AbstractBase {
public static final String NAME = "Base";
@OrderBy("jahr ASC")
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name="BASE_ID", referencedColumnName="id")
private List<PlanungA> planungA;
@OrderBy("jahr ASC")
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name="BASE_ID", referencedColumnName="id")
private List<PlanungB> planungB;
@OrderBy("jahr ASC")
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name="BASE_ID", referencedColumnName="id")
private List<PlanungC> planungC;
[...]
アプリケーション コード
List list = base.getPlanungA();
list.clear();
問題
他のステートメントに加えて、Hibernate は次の SQL を発行します。
update
PLANUNG
set
BASE_ID=null
where
BASE_ID=?
結果として、すべてのコレクション (PlanungA、B、C) は Base オブジェクトへの参照を失います。
Discriminator がありません (例: AND DISC='PlanungA')。
私がすでに試したこと
- 私はすでに Hibernate 3.6.10.Final にアップグレードしました (試してみるために)。この動作は解決しませんでした。
- 世界中を探した...
私に同様の問題を指摘するなど、どんな助けも大歓迎です。
ありがとう!