2

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 にアップグレードしました (試してみるために)。この動作は解決しませんでした。
  • 世界中を探した...

私に同様の問題を指摘するなど、どんな助けも大歓迎です。

ありがとう!

4

1 に答える 1

1

対応する休止状態の問題を指摘してくれてありがとう、overmeulen 。これはまだ未解決の Hibernate バグです。

問題のコメントに記載されている解決策の 1 つを適用しました。

@OrderBy("jahr ASC")
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name="BASE_ID", referencedColumnName="id")
@Where(clause="DISC='PlanungA'")
private List<PlanungA> planungA;

@Whereを挿入することにより、ステートメントは次のように OR マッピングによって発行されます。

update
    PLANUNG 
set
    BASE_ID=null 
where
    BASE_ID=? 
    and (
        DISC='PlanungA'
    ) 

問題が解決しました

ありがとう!

于 2013-02-22T11:47:48.527 に答える