2013-03-08 60 views
3

我有一些問題建模外鍵我喜歡它處於休眠方式4.1.9Hibernate的註解與普通列外和主鍵

我基本上有以下代碼:

@Entity 
@XmlRootElement 
@Table(name="User") 
public class UserVO 
{ 
    private String email; 

    @Id 
    @Column(name="email", unique=true, nullable=false) 
    @XmlElement 
    public String getEmail() 
    { 
     return this.email; 
    } 
} 

這:

@Entity 
@XmlRootElement 
@Table(name="Authentification") 
public class AuthentificationVO 
{ 
    private String email; 
    private UserVO user; 

    @Id 
    @Column(name="email", unique=true, nullable=false) 
    @XmlElement 
    public String getEmail() 
    { 
     return this.email; 
    } 

    @OneToOne(cascade = CascadeType.ALL) 
    @ForeignKey(name="user_fk") 
    public UserVO getUser() 
    { 
     return this.user; 
    } 
} 

這一切問題的關鍵,是要有兩個表中名爲email列,這也應作爲用戶身份認證和兩個表的主鍵。出於某種原因,當我運行這個時,Hibernate堅持向名爲user_email的認證表添加一列,但我希望它使用已經存在的名爲email的列。

我試着四處尋找解決方案,我試圖使用mappedBy註解,以及JoinColumn,但似乎沒有任何關鍵。

回答

2

究竟到底做的把戲添加以下注釋:

@OneToOne(cascade = CascadeType.ALL) 
@JoinColumn(name="email") 
@MapsId 

我刪除了ForeignKey的註解,因爲它創建表的時候被忽略。唯一的影響是約束的命名,它現在由休眠自動生成,我可以忍受。

+0

它爲我工作,當我使用MapsId。 – skstar 2015-04-29 05:21:07

1

對於一對一,您需要指定@JoinColumn(name="user_fk")作爲映射。 的@ForeignKey註釋只是爲了覆蓋由Hibernate生成的外鍵的名稱,而不是告訴冬眠至極列使用(這是@JoinColumn的作用)

[評論後編輯]

實際上,當您在主鍵上映射時,應該使用@MapsId註釋來指示您正在映射到關聯實體的Id。 那麼你的映射應該變成:

@OneToOne(CascadeType.ALL) 
@ForeignKey(name="email") 
@MapsId 
+0

好的,那會讓我感到中途。 它似乎只是幫助,如果我有除了電子郵件以外的任何其他元素的Id註釋,但是當我有與fk相同的列Id注​​釋,它不能創建一個外鍵。 – Chris 2013-03-08 20:38:09

+0

'@ PrimaryKeyJoinColumn'應該可以做到! – benzonico 2013-03-08 20:44:26

+0

我很抱歉地說,無論是否使用JoinColumn或PrimaryKeyJoinColumn,只要Id註釋出現在AuthentificationVO類的電子郵件字段中,就永遠不會創建外鍵。表格創建得很好,並且填充了數據,但fk從未創建。 – Chris 2013-03-08 20:54:27