我目前有一个看起来像这样的表:
用户
用户名地址 dob ...
和
角色用户名角色
我想在 Role.username 和 User.username 之间建立一个外键约束。我应该如何与安一起做这件事
我目前有一个看起来像这样的表:
用户
用户名地址 dob ...
和
角色用户名角色
我想在 Role.username 和 User.username 之间建立一个外键约束。我应该如何与安一起做这件事
约束将从您正在使用的 DBMS 创建。然后使用 JPA,您将映射它。
JPA 的一个很好的参考是这本书: Pro JPA 2
如果您可以从表/类型名称的末尾删除“s”会很好 - 每行/实例代表一个项目,而不是很多。
在角色实体中使用@ManyToOne
带注释的字段 - 字段类型为“用户”,名称为“用户”。这是 Role 拥有的关系字段 - FK 列将进入 Role 表。
或者,@OneToMany(mappedBy="user")
在用户实体中使用注释字段 - 字段类型为Collection<Role>
or List<Role>
,具体取决于您在写入数据库时是否要保留应用程序插入的顺序。这是一个非拥有关系字段,这意味着没有 FK 列将进入用户表 - 我们必须使用mappedBy
来命名用户实体上的拥有关系。 但是,如果您省略 (2) 并包含 (3),这将变为拥有,然后不再使用 mappedBy,但可以使用 column="some_db_colname" 代替。
在用户名上设置的用户实体@Id
中(基本类型的单个 PK 字段)。
@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
}
准备使用... =:-)