2014-02-13 68 views
21

我試圖讓休眠@OneToOne註釋工作,並沒有在這裏很成功......的Java:Hibernate的@OneToOne映射

比方說,我有一個表叫status,看起來像這樣:

+------------------------------------------------+ 
|      status      | 
+------------------------------------------------+ 
| id | frn_user_id | frn_content_id | status | 
+----+-------------+----------------+------------+ 
| 1 |  111  |  0  | "active" | 
+----+-------------+----------------+------------+ 
| 2 |  0  |  222  | "inactive" | 
+----+-------------+----------------+------------+ 

而且我已經得到了User,看起來像這樣的實體:

@Entity 
@Table(name = "user") 
public class User { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "id", nullable = false) 
    private Integer id; 

    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "userId") 
    private Status status; 

    // getters and setters 
} 

,用一個類似的Content,和爲Status諾特爾實體,看起來像這樣:

@Entity 
@Table(name = "status") 
public class Status { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "id", nullable = false) 
    private Integer id; 

    @Column(name = "frn_user_id") 
    private Integer userId; 

    @Column(name = "frn_content_id") 
    private Integer contentId; 

    @Column(name = "status") 
    private String status; 

    // getters and setters 
} 

當我執行上User讀,我希望User.getStatus()將返回Status物體id=1。相反,我得到一個AnnotationException:「引用屬性不是(One | Many)ToOne:Status.userId在mappedBy User.status」

我已經傾倒了文檔,教程和示例在這裏所以,至今嘗試過的失敗了。

另外值得注意的是:這應該支持一對一或一對一的關係,因爲某些usercontent記錄在status表中不會有引用。

任何幫助將不勝感激!

+2

'userId'需要是帶'@ OneToOne' /'@ JoinColumn'的'User'類型。另請注意,您有一個錯字(contentId/userId) – 2014-02-13 18:20:51

+0

另請參閱http://stackoverflow.com/questions/18303522/jpa-hibernate-issue-with-onetoone-mappedby-annotation?rq=1 – 2014-02-13 18:21:53

+0

只是一個數據庫設計理念:也許你可以重新考慮你的設計作爲用戶和內容之間的多對多關係,並且狀態描述將在該設計中是一個用戶屬性? –

回答

65

您的狀態實體不得具有Integer類型的屬性userIdcontentId,與@Column映射。它必須具有屬性user和類型的用戶和內容,與@OneToOne映射的content

public class User { 
    @OneToOne(mappedBy = "user") 
    private Status status; 
    // ... 
} 

public class Status { 
    @OneToOne 
    @JoinColumn(name = "frn_user_id") 
    private User user; 
    // ... 
} 

用戶具有一個狀態。狀態有一個用戶。

+0

感謝您分享此。我被過去3天的'mappedBy'困住了。我谷歌搜索&經過這麼多Stackoverflow的帖子,但沒有運氣。當我通過你的解決方案時,我記得**我已經在關係**的背面的'OneToOne'映射中創建了一個'java.util.Set'。只要**我刪除了'Set'並且只需創建實體類型屬性,我的代碼就開始工作**。非常感謝。給予好評。 – OO7

+0

我經歷了[@Vlad Mihalcea回覆此帖子]有點困惑(http://stackoverflow.com/questions/23925322/delete-child-from-parent-and-parent-from-child-automatically-with -jpa-註解/ 23926548#23926548)。在他的回答中,'孩子'有'許多玩具',那麼*爲什麼他用'OneToOne(mappedBy =「child」)''註釋了'List 玩具'?爲什麼不用'OneToMany'?*你也在'Status'的'User'中指定了'JoinColumn',而Vlad Mihalcea沒有在'Toy'中的'Child'中。 * mappedBy'帶有/不帶'JoinColumn'的目的是什麼?*請您澄清我的疑問嗎? – OO7

+0

這是錯的。它應該是OneToMany。JoinColumn用於指定連接列的名稱。如果你沒有指定一個,Hibernate將使用一個defaukt名字(這個默認名字是如何構造的,在JPA規範中指定) –