我目前有一张如下表:
用户
的用户名 地址 DOB ...
和
角色 用户名 作用
我想在Role.username和User.username之间建立外键约束。我应该如何使用ann
来做这件事答案 0 :(得分:1)
将从您正在使用的DBMS创建约束。然后使用JPA,您将映射它。
本书对JPA的一个很好的参考: Pro JPA 2
答案 1 :(得分:1)
如果您可以从表/类型名称末尾删除“s”,那将会很好 - 每行/实例代表一个项目,而不是很多。
在Role实体中使用@ManyToOne
带注释的字段 - 使用“User”类型的字段并命名为“user”。这是Role所拥有的关系字段 - FK列将位于Role表中。
(可选)在用户实体中使用@OneToMany(mappedBy="user")
注释字段 - 使用类型为Collection<Role>
或List<Role>
的字段,具体取决于您是否要保留应用插入的顺序写入DB。这是一个非拥有关系字段,意味着没有FK列将进入User表 - 我们必须使用mappedBy
来命名User实体上的拥有关系。 但是,如果省略(2)并包含(3),则它变为拥有,然后不使用mappedBy,但可以使用column =“some_db_colname”。
在用户实体中设置@Id
用户名(基本类型的单个PK字段)。
在角色实体中设置@Id
用户(非基本类型)和角色(基本类型)。
此外,因为您有两个@Id
字段,并且因为其中一个不是基本类型,您必须另外创建一个重复相同字段名称的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
}
准备使用...... =: - )