2016-09-09 4 views
0

私は2つのテーブルを持っています。私はそれらの間に関係を作りたいのですが、それは子テーブルが親ノードの属性に接続することです。これはPKではありません。テーブルのFKとして非PKフィールドをどのように割り当てることができますか? ここに表があります。ユーザー情報:外部フィールドとしての通常のフィールド

@Entity 
@Table(name="user") 
public class userinformation implements Serializable { 

    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY)  
    @Column(name="USER_ID") 
    private int uID; 

    @Column(name="LIB_ID") 
    private String libID; 

    //Other attributes 
} 

Libの情報

@Entity 
@Table(name="libinfo") 
public class Auth { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name="AUTH_ID") 
    private int authID; 

    @Column(name="LIB_ID") 
    private String lib_ID; 

    //Other attributes 
} 

彼らの両方がlibID(確かにユニーク)を介してリンクされなければなりません。それを正しく実装する方法は?

class User { 
    @Column(name = "lib_id") 
    private String libID; 
} 

をあなたのようにAuthエンティティをマップする必要があります:基本的には、referencedColumnNameは、それが主キー列以外の列を使用する必要がありますJPAプロバイダを通知するために使用される

class Auth { 
    @JoinColumn(name = "lib_id", referencedColumnName = "lib_id") 
    @ManyToOne 
    private User user; 
} 

考える

+0

O-O技法を使用し、任意のStringではなくオブジェクト参照を配置することによって、「正しく」実装します。次に参照整合性が得られます。標準のJPAでは、あなたが求めていることはできません。 –

+0

@NeilStocktonしかし、私は単純に 'private userinformation lib_ID'と宣言すれば、' userinformation'クラスの 'libID'にリンクすることをどうすればいいのですか? – nlimits

+0

まず、UserInformationフィールド" lib_ID "を呼ぶことはありません。それはUserInformation OBJECTです。次に、フィールドオブジェクトを割り当て、それを永続化する場所にコードを投稿します。 AuthクラスはUserInformationにFK列を持つテーブルを持っています –

答えて

0

(デフォルトで@ManyToOneのマッピングで使用されます)。

+1

JPA仕様_PresentableColumnNameを使用するアプリケーションは主キー列ではありませんportable_ –

+0

JPA仕様では約100か所で 'not portable'というフレーズを使用していますが、異なる状況で'refrencedColumnName'属性のコンテキストでは、JPAプロバイダがこの属性を実装する必要がないことを明確にするために使用されます。したがって、アプリケーションはプロバイダ間で移植できない可能性があります。非プライマリ・キー・カラムを使用する関連付けが一般的なデータベース設計の慣習であることを考えると、 'refrencedColumnName'と次のバージョンをサポートするJPA 2.1の3つの実装は、どこにも見当たらず、ポータブルでないアプリケーションについては心配しません。 – manish

関連する問題