0

私は現在、次のようなテーブルを持っています:

ユーザー

ユーザー名アドレスdob..。

ロールユーザー名ロール

Role.usernameとUser.usernameの間に外部キー制約を作成したいと思います。アンでこれを行うにはどうすればよいですか

4

2 に答える 2

1

制約は、使用しているDBMSから作成されます。次に、JPAを使用してマップします。

JPAへの良いリファレンスはこの本です: Pro JPA 2

于 2012-08-09T07:42:18.467 に答える
1
  1. テーブル/タイプ名の末尾から「s」を削除できれば便利です。各行/インスタンスは1つの項目を表し、多くはありません。

  2. @ManyToOneRoleエンティティ内で注釈付きフィールドを使用します-タイプは「User」、名前は「user」です。これは、Roleが所有するリレーションシップフィールドです。FK列はRoleテーブルに配置されます。

  3. 必要に応じて、@OneToMany(mappedBy="user")ユーザーエンティティ内の注釈フィールドを使用します-DBに書き込むときにアプリの挿入の順序を保持するかどうかに応じて、タイプCollection<Role>またはのフィールドを使用します。List<Role>これは所有されていない関係フィールドです。つまり、FK列がUserテーブルに入らないことを意味しmappedByます。Userエンティティで所有されている関係に名前を付けるために使用する必要があります。 ただし、(2)を省略して(3)を含めると、これが所有され、mappedByは使用されませんが、代わりにcolumn="some_db_colname"を使用できます。

  4. ユーザー名に設定されたユーザーエンティティ@Id(基本タイプの単一のPKフィールド)。

  5. @Idユーザー(非基本タイプ)とロール(基本タイプ)の両方に設定されたロールエンティティ内。

さらに、2つの@Idフィールドがあり、そのうちの1つは基本タイプではないため、同じフィールド名を繰り返すクラスを追加で作成する必要がありますRoleIdが、今回は、データ型を基になる基本タイプにマップします(PKにあります)。参照されるエンティティのフィールドであり、基になるDBテーブルと一致します。役割に注釈を付ける@IdClass(RoleId)

@Entity
public class User {

     @Id
     String username;  // for simplicity match the db column name

     String address;

     Date dateOfBirth;

     @OneToMany(mappedBy="user")
     Collection<Role> rolesForUser;

     // other fields and methods
}

@Entity
@UserId(RoleId)
public class Role {

     @Id
     @ManyToOne
     User user;

     @Id
     String role;  // for simplicity, match the DB column name

     // other fields and methods
}

public class RoleId {

     String user;

     String role;

     public RoleId() { // ...}  // all entities must have no-arg constructor
     // additional arg constructor - so we can set fields without having setters
     public RoleId(String user, String role) { this.user = user; this.role = role}  

     public String getUser() { return user; }  // omit setter: Id is immutable once created
     public String getRole() { return role; }  // omit setter: Id is immutable once created
}

すぐに使用できます...=:-)

于 2012-10-15T23:47:13.380 に答える