2012-01-17 272 views
1

我想就如何最好地布局我的JPA实体类提供一些建议。假设我有两个表格,我想将它们建模为实体,用户和角色。映射JPA实体关系

Create Table users(user_id primary key, 
        role_id integer not null) 
Create table role(role_id primary key, 
        description text, 
       ) 

我创建以下两个JPA实体:

@Entity 
@Table(name="users") 
@Access(AccessType.PROPERTY) 
public class User implements Serializable { 
     private Long userId; 
     private Long roleId; 
     private Role role; 

     @Column(name = "user_id") 
     @Id 
     public Long getUserId() {} 

    @Column(name = "role_id") 
     public Long getRoleId() {} 

     @ManyToOne() 
     JoinColumn(name="role_id") 
     public Role getRole() {} 
} 

角色实体:

@Entity 
@Table(name="Role") 
@Access(AccessType.PROPERTY) 
public class Role implements Serializable { 
     private String description; 
     private Long roleId; 


     @Column(name = "role_id") 
     @Id 
     public Long getRoleId() {} 

    @Column(name = "description") 
     public Long getDescrition(){} 

     @ManyToOne() 
     @JoinColumn(name="role_id") 
     public Role getRole() {} 
} 

会以正确的方式来这种关系模型如上,否则我将放弃私人long roleId;在用户中?欢迎任何意见。 当我这样映射它,我收到以下错误:

org.hibernate.MappingException: Repeated column in mapping for entity: 
+0

你真的希望将用户限制为具有正好一个(或无)'Role'? – millhouse 2012-01-17 01:57:43

+0

@角色。在这个应用程序中,是的,他们应该只有1个角色。 – 2012-01-17 02:15:54

回答

1

是的,你就当你在同一列@ManyToOne掉落private Long roleId映射。

正如错误所暗示的,您只能映射@Entity中的每个列一次。由于role_id@ManyToOne引用的@JoinColumn,因此不能将其映射为属性。

你可以,但是,增加一个便捷方法返回的角色ID,像

public Long getRoleId() { 
    return role.getId(); 
} 
+0

也 - 不是问题的组成部分,但您可能不需要'@ Access'修饰符默认 – wrschneider 2012-01-17 02:37:20

+0

谢谢。当我放弃私人Long roleId时,一切似乎都很顺利。我只是不知道自己是否应该在后端数据库表中。但我想这样做是可以接受的。 – 2012-01-17 03:55:24