2011-04-02 88 views
2
@Entity 
public class User { 
    private String mail; 
    private String password; 

    @OneToMany(mappedBy="user") 
    private List<UserGroup> userGroups; 
} 

@Embeddable 
public class UserGroupPK { 
    private String mail; 
    private String role; 
} 

@Entity 
public class UserGroup { 
    @EmbeddedId 
    private UserGroupPK id; 
    private String field; 

    @ManyToOne 
    @MapsId("mail") 
    private User user; 
} 

Hibernate創建兩個表:用戶(郵件,密碼)和用戶組(user_mail,角色,字段)。JPA外鍵列名

我需要將user_mail列重命名爲郵件。我試圖在UserGroupPK中添加@Column(name="mail"),但沒有任何內容。

+0

您是否使用Hibernate生成架構? – 2011-04-02 17:02:22

+0

是的,休眠。 – Alf 2011-04-02 21:14:05

回答

3

我想,下面應該工作:

@Entity 
public class UserGroup { 
    @EmbeddedId 
    private UserGroupPK id; 
    private String field; 

    @ManyToOne(referencedColumnName = "mail") 
    @JoinColumn(name = "mail") 
    private User user; 
} 

參考Hibernate文檔中的相應段落5.1.7.1. Using a foreign key or an association table

的@JoinColumn屬性是可選的,默認值(s)是所有者方關係名稱的連接,_(下劃線)以及所有權方主鍵列的名稱。在本例[user_mail]中,因爲屬性名稱是[user],[User]的列id [(實際上是referencedColumnName)]是[mail]。

(我在括號[]替換值。)

請注意,您的用戶實體沒有一個主鍵,這可能不是一個好主意。你想達到什麼目的?

+0

使用@JoinColumn它的作品。 @JoinColumn是@MapsId的替代品還是我可以一起使用它們嗎?在這些情況下,JPA 2.0規範使用MapsId。 PS:我忘記在轉錄過程中將@Id添加到用戶實體 – Alf 2011-04-04 14:22:59

+0

@Alf:僅在主鍵的一部分也是外鍵時才使用@MapIdId。所以在你的情況下,你應該可以使用它(因爲你現在已經爲用戶添加了@Id屬性)。我假設,在這種情況下,您可以結合'@ MapsId'和'@ JoinColumn',但我還沒有測試過這種特殊組合。你能幫我試試嗎? – 2011-04-04 17:45:10

+0

嗨克里斯,我試過@MapsId和@JoinColumn的組合,工作正常。謝謝。 – Alf 2011-04-04 19:50:21