2012-01-04 27 views
0

數據庫OneToOne具有相同的PrimaryKey和ForeignKey的

*user_account* 
id (PK) 
email 
password 

*user_detail* 
id(PK)(FK) 
name 
city 

實體

@Table(名稱= 「user_detail」) 公共類UserDetail implementsSerializable {

@Id private Integer id; 
... 
@OneToOne 
@JoinColumn(name="id") 
private UserAccount userAccount; 

}

@Table(name="user_account") 
public class UserAccount implementsSerializable{ 
    @Id private Integer id; 
    @OneToOne(mappedBy="userAccount") 
    private UserDetail userDetails; 
} 

錯誤 異常描述:多個可寫映射領域[user_detail.ID]存在。只有一個可以被定義爲可寫,所有其他都必須被指定爲只讀。

回答

1

如果UserAccount的ID既是主鍵和外鍵,那麼你就應該宣佈它作爲一個字段,並適當地映射。像這樣:

@Entity 
public class UserAccount implements Serializable { 
    @Id 
    @OneToOne(mappedBy="userAccount") 
    private UserDetail userDetails; 
} 

否則使用@MapsId

然而,我懷疑你真正想要的是一個單一的類分佈在兩個表:

@Entity 
@Table(name = "user_account") 
@SecondaryTable(name = "user_detail") 
public class User implements Serializable { 
    @Id 
    private int id; 
    private String email; 
    private String password; 
    @Column(table = "user_detail") 
    private String name; 
    @Column(table = "user_detail") 
    private String city; 
} 
+0

是否有意義有數據庫中的兩個表,只是一個實體類? – TGM 2012-01-04 16:35:54

+0

因爲你在做什麼是一個構圖是的,它的確如此。真正的問題可能是:有兩張桌子有意義嗎? – Viruzzo 2012-01-04 16:46:43

1

你不能同時擁有@Id private Integer id;@JoinColumn(name="id"),你必須刪除其中的一個:我懷疑你確實需要一個主鍵的細節,所以只需從那裏刪除@Id行。

+0

您使用的表沒有主鍵提示? – 2012-01-04 16:00:04

+0

沒有,只是從'UserDetail'類中刪除註釋和領域。無論如何,他並不需要它,因爲通過一對一映射檢索用戶詳細信息。 – Viruzzo 2012-01-04 16:06:30

+0

哦,我明白了。那麼他會有一個沒有ID的實體類?這對我來說仍然是錯誤的。 – 2012-01-04 16:10:11