1

互いに継承し、ディスクリミネーターを使用して作成するクラスを決定するJPAエンティティがいくつかあります(まだテストされていません)。

@Entity(name="switches")
@DiscriminatorColumn(name="type")
@DiscriminatorValue(value="500")
public class DmsSwitch extends Switch implements Serializable {}

@MappedSuperclass
public abstract class Switch implements ISwitch {}

@Entity(name="switch_accounts")
public class SwitchAccounts implements Serializable {
    @ManyToOne()
    @JoinColumn(name="switch_id")
    DmsSwitch _switch;
}

そのため、SwitchAccounts クラスでは基本クラス Switch を使用したいと考えています。これは、実行時までどのオブジェクトが作成されるかわからないためです。どうすればこれを達成できますか?

4

3 に答える 3

2

以前のコメンテーターとして、私はクラスモデルが異なるべきであることに同意します。次のようなもので十分だと思います。

@Entity(name="switches")
@DiscriminatorColumn(name="type")
@DiscriminatorValue(value="400")
public class Switch implements ISwitch {
  // Implementation details
}

@Entity(name="switches")
@DiscriminatorValue(value="500")
public class DmsSwitch extends Switch implements Serializable {
  // implementation
}

@Entity(name="switches")
@DiscriminatorValue(value="600")
public class SomeOtherSwitch extends Switch implements Serializable {
  // implementation
}

コンストラクターを保護することで、スイッチのインスタンス化を直接防ぐことができます。Hibernateはそれを受け入れていると思います。

于 2008-10-03T20:23:17.797 に答える
1

スイッチ クラスはエンティティではないため、エンティティ関係では使用できません...残念ながら、マッピングされたスーパークラスをエンティティとして変換して関係に含める必要があります。

于 2008-10-03T19:17:29.990 に答える
0

現在のオブジェクト モデルではできないと思います。Switch クラスはエンティティではないため、リレーションシップでは使用できません。@MappedSuperclass アノテーションは、ポリモーフィック エンティティを記述するためではなく、利便性のためのものです。Switch クラスに関連付けられたデータベース テーブルはありません。

Switch をエンティティにするか、他の方法で変更して、エンティティである共通のスーパークラスを作成する必要あります。

于 2008-10-03T19:16:12.660 に答える