在JPA中指定外键

时间:2012-08-07 09:54:48

标签: hibernate java-ee jpa foreign-keys

我目前有一张如下表:

用户

的用户名 地址 DOB ...

角色 用户名 作用

我想在Role.username和User.username之间建立外键约束。我应该如何使用ann

来做这件事

2 个答案:

答案 0 :(得分:1)

将从您正在使用的DBMS创建约束。然后使用JPA,您将映射它。

本书对JPA的一个很好的参考: Pro JPA 2

答案 1 :(得分:1)

  1. 如果您可以从表/类型名称末尾删除“s”,那将会很好 - 每行/实例代表一个项目,而不是很多。

  2. 在Role实体中使用@ManyToOne带注释的字段 - 使用“User”类型的字段并命名为“user”。这是Role所拥有的关系字段 - FK列将位于Role表中。

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

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

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

  6. 此外,因为您有两个@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
    }
    

    准备使用...... =: - )