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”会很好 - 每行/实例代表一个项目,而不是很多。

  2. 在角色实体中使用@ManyToOne带注释的字段 - 字段类型为“用户”,名称为“用户”。这是 Role 拥有的关系字段 - FK 列将进入 Role 表。

  3. 或者,@OneToMany(mappedBy="user")在用户实体中使用注释字段 - 字段类型为Collection<Role>or List<Role>,具体取决于您在写入数据库时​​是否要保留应用程序插入的顺序。这是一个非拥有关系字段,这意味着没有 FK 列将进入用户表 - 我们必须使用mappedBy来命名用户实体上的拥有关系。 但是,如果您省略 (2) 并包含 (3),这将变为拥有,然后不再使用 mappedBy,但可以使用 column="some_db_colname" 代替。

  4. 在用户名上设置的用户实体@Id中(基本类型的单个 PK 字段)。

  5. @Id在用户(非基本类型)和角色(基本类型)上设置的角色实体中。

此外,因为您有两个@Id字段并且其中一个不是基本类型,所以您必须另外创建一个RoleId重复相同字段名称的类,但这一次,将数据类型映射到基础基本类型 - 如 PK 中所示引用实体的字段并与基础数据库表一致。注释角色@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 回答