2012-01-17 273 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