2016-06-30 3 views
0

私は答えを見つけようとしていましたが、残念ながら、運がない。これは、外部または内部のユーザー JPA - 条件付きでこの結合をモデル化する方法

  • INTERNAL_USERSがあれば言ってUSERTYPEまた、USERIDは含まれています - -

    • TABLE_X含まれているキーのuserId
    • EXTERNAL_USERS - も含まれています

      は、データ構造は次のようになりますキーユーザーID

    TABLE_X.userId is ei INTERNAL_USERS.userIdまたはEXTERNAL_USERS.userIdです。

    ここでは、TABLE_Xからエンティティをマップし、正しいエンティティ(INTERNAL_USERSまたはEXTERNAL_USERS)にマッピングされたユーザーオブジェクトを持っています。 どうすればよいですか?

    2つのフィールドを作成し、INTERNAL_USERSとEXTERNAL_USERSにマップし、どちらが空でないかを確認する必要がありますか?

  • 答えて

    0

    私が正しくあなたの質問を理解していれば、何をしなければならないことはTABLE_XクラスのフィールドでTABLE_X列の構造を複製し、フィールドにINTERNAL_USERS.userID用とEXTERNAL_USERS.userID

    のための1つを追加することですしかし、もしあなたがTABLE_X.userTypeに格納しているのは、ユーザが内部か外部かを問わず、最初のテーブル(TABLE_X)に必要な情報しか持っていないので、他のテーブルを作成するのではないと思います。たとえば、内部のすべてのユーザーを知りたい場合は、SQLを実行してTABLE_Xからすべての値を選択します。userType = "Internal"

    0

    ここで説明するよう、あなたはJPA継承を使用することができます。休止状態で

    https://en.wikibooks.org/wiki/Java_Persistence/Inheritance#Example_joined_inheritance_annotations

    を次のようにあなたは、このような関係をモデル化することができます。ユーザーを照会するとき、Hibernateを使って正しいタイプのインスタンスを返すことができます。

    @Entity 
    @Inheritance(strategy=InheritanceType.JOINED) 
    public class User{ 
    
        @Id 
        private Long userId; 
    } 
    
    @Entity 
    public class InternalUser extends User{ 
    
    
    } 
    
    @Entity 
    public class ExternalUser extends User{ 
    
    
    } 
    

    に連結された記事で述べたように、Hibernateは接合された継承を使用するときに指定する識別子列を必要としません。しかし、それが利用可能な場合、弁別子列をサポートします。あなたのスキーマuserTypeを利用できるようにしたい場合は、望むなら明示的に指定することができます。私は、これは生成されたSQLの面でいくつかのパフォーマンス上の利点をもたらすであろうと想像:

    @Entity 
    @Inheritance(strategy=InheritanceType.JOINED) 
    @DiscriminatorColumn(name="userType") 
    public class User{ 
    
        @Id 
        private Long userId; 
    } 
    
    @Entity 
    @DiscriminatorValue("INT") 
    public class InternalUser extends User{ 
    
    
    } 
    
    @Entity 
    @DiscriminatorValue("EXT") 
    public class ExternalUser extends User{ 
    
    
    } 
    
    :オプションの識別カラムと

    マッピング