2017-10-10 16 views
0

が存在するとき、不足しているサブクラスのエンティティを作成する、彼らは両方のPKと同じIDを持っていると私は作成したHibernateのクラスがありますこれらのように:歴史的経緯によりスーパーは、私は(1:1の関係)のデータベース上の2つのテーブル<strong>S</strong>と<strong>私は</strong>を持って

@Entity 
@Inheritance(strategy = InheritanceType.JOINED) 
public class S { 
    @Id 
    @Column(name = "id") 
    @GeneratedValue(...) 
    @SequenceGenerator... 
    private long id; 

    .... 
} 

@Entity 
@PrimaryKeyJoinColumn(name = "id") 
public class I extends S { 
    .... 
} 

、データベース内にタイプSのオブジェクトではなく、タイプIの関連オブジェクトがあります。私はそれらをIのオブジェクトを作成したいと思います。どうやってやるの? I左からタイプオブジェクトを作成できますか?このようなHQLクエリを結合しますか?私が作成した新しいIエンティティ(新しいI())し、それを持続しようとした場合

select i from I i right join i.id s where s.id = :id 

、私はそれが既に存在しているSレコードを作成しようとして、いくつかの例外を得ることができました。 エンティティのレコードはまだ存在しません。この不足を作成するにはどうすればいいですかI部分エンティティ?

PSあなたが私に確かにあなたのために動作します

+0

これはhttps://stackoverflow.com/questions/26038707/how-to-create-child-object-of-existing-super-object-using-joined-inheritance-stのように似たような状況でありますしかし、私はそのアプローチだけでなく、それを解決する手段に興味があります.... – MihaiS

答えて

0

一つのアプローチ(しばらくはあるが、きれいではないです)不明確なものを指している場合、私は疑問を調整しますが、SQLを直接挿入して、私の記録を作成することです: insert into I_table values (...)。 対応するレコードがI_tableにある場合、ORMはオブジェクトをIタイプでロードし始めます。

あなたのORMと一緒に持っていて、Sレコードを削除することができた場合、あなたは

  1. ロードS
  2. idで Iを作成
  3. (あなたのフラッシュモードに基づい?フラッシュ)Sを削除することができますI
  4. コピーS
  5. 保存I
+0

これは解決策のように見えますが、問題はSが大きなエンティティツリーのルートであり、これを選択することは、もう1つ、これは控えめに言っても面倒です。 – MihaiS

0

あなたが作成しようとしているのは、エンティティ階層です。エンティティを正しくマップする必要があります。以下は、何が必要でしょうです:これにより

@Entity 
@Inheritance(strategy = InheritanceType.JOINED) 
@DiscriminatorColumn(discriminatorType = DiscriminatorType.CHAR) 
@DiscriminatorValue("S") 
public class S { 
    @Id 
    //........ 
    private long id; 

    .... 
} 

@Entity 
@DiscriminatorValue("I") 
public class I extends S { 
    .... 
} 
  • 行がSまたはIに属しているかどうかを識別するDTYPE(弁別タイプのため)という名前の列が含まれるテーブルSを設定します。これがデフォルトです。あなたが望んでいなければ、DiscriminatorColumn注釈の名前を付ける必要があります。

  • Sのインスタンスを作成し、継承されたプロパティ(Sのすなわち、性質)及び独自のプロパティをポピュレートすることによって「I」のインスタンスを作成し、そして保存

  • を保存します。

  • あなたがIを対象にクエリを作成するときは、Iのインスタンスのみを取得しますが、あなたのクエリがSをターゲットにしている場合、あなたは両方のエンティティのインスタンスを取得します。

関連する問題