2014-11-03 86 views
0

我有這種情況:Hibernate的一對一與FK映射

Class A { 

    @Id 
    Integer id; 

    @OneToOne 
    @JoinColumn(name = "b.a_id", referencedColumnName = "id") 
    B b; 
} 

Class B { 

    @Id 
    Integer id; 


    Integer a_id; 
} 

的FK在B表。

運行過程中出現下面的查詢不起作用:

SELECT A1 FROM A A1 LEFT JOIN FETCH A1.b WHERE A1.id = 6; 

我沒有得到B.

而且,如果我讓Hibernate生成數據庫,它設置一個FK在A表,但我想要在B桌上。 不應該有雙向映射。

請幫忙,我該怎麼做?

回答

1

我認爲一個可能的解決方案是將B類設置爲關係的所有者一方。您還可以管理使用其他外部表的關係,請參閱this

@Entity 
public class A { 
    @Id 
    private Integer id; 

    @OneToOne(mappedBy = "a") 
    private B b; 
} 

@Entity 
public class B { 
    @Id 
    private Integer id; 

    @OneToOne 
    @JoinColumn(name = "a_id") 
    private A a; 

} 

mysql> desc A; 
+-------+---------+------+-----+---------+-------+ 
| Field | Type | Null | Key | Default | Extra | 
+-------+---------+------+-----+---------+-------+ 
| id | int(11) | NO | PRI | NULL |  | 
+-------+---------+------+-----+---------+-------+ 
1 row in set (0.00 sec) 

mysql> desc B; 
+-------+---------+------+-----+---------+-------+ 
| Field | Type | Null | Key | Default | Extra | 
+-------+---------+------+-----+---------+-------+ 
| id | int(11) | NO | PRI | NULL |  | 
| a_id | int(11) | YES | MUL | NULL |  | 
+-------+---------+------+-----+---------+-------+ 
0

如果你想有一個單向@OneToOne,在目標表的外鍵,嘗試用這種

@OneToOne 
@JoinColumn(name = "a_id", insertable = false, updateable = false) 
B b; 

insertable = false, updateable = false應指示休眠來尋找目標表聯接列。

+0

不,它不起作用。它產生這個連接:左外連接,其中A.a_id = B.id.這是顛倒 – 2014-11-03 12:42:26

+0

@Idob奇怪,根據[文檔](http://en.wikibooks.org/wiki/Java_Persistence/OneToOne#Target_Foreign_Keys.2C_Primary_Key_Join_Columns.2C_Cascade_Primary_Keys)和[這個答案](http://stackoverflow.com/ a/26590407/4074715),它應該工作 – 2014-11-03 12:50:53

+0

@Idob你不需要在'B'中有'a_id'作爲字段,也許這就是它不起作用的原因。如果沒有它,當然,你不需要爲其他原因映射它。 – 2014-11-03 13:08:30

0

OK,嘗試幾乎所有的東西后,我不得不妥協,決定去與雙向映射。

這可以很容易地修復一切。

我把A側放在了mappedBy上,我把@JoinColumn放在B類的A屬性上。

謝謝大家的幫助。