2017-08-09 78 views
0

我在休眠A和B有2個實體。這裏是相關的代碼。休眠一對一連接使用主鍵不工作

@Entity 
public class A { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "id") 
    private Integer id; 

    @OneToOne(mappedBy = "a", cascade = CascadeType.ALL) 
    private B b; 
} 

@Entity 
public class B { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "id") 
    private Integer id; 

    @Column(name = "a_id") 
    @GeneratedValue(generator = "gen") 
    @GenericGenerator(name = "gen", strategy = "foreign", parameters = @Parameter(name = "property", value = "a")) 
    private Integer aId; 

    @OneToOne(fetch = FetchType.LAZY, optional = false) 
    @PrimaryKeyJoinColumn 
    private A a; 
} 

我一樣在下文提到的鏈接中提到 one to one mapping using primary key join column

但是同樣的,當我做下面的HQL查詢,

"from A a left join a.b" 

聯接採取下述條件

a.id = b.id 

雖然我是德公畜是以下條件

a.id = b.aId 
+0

請你記住我的答案回答? –

回答

0

您已給定的類A的參考調遣類B.

@OneToOne(fetch = FetchType.LAZY, optional = false) 
@PrimaryKeyJoinColumn 
private A a; 

和B類到磁場B在A類

@OneToOne(mappedBy="a", cascade=CascadeType.ALL) 
    private B b; 

所以默認情況下,Hibernate用參考字段創建一個連接查詢。所以休眠默認情況下在a.id = b.id上執行連接。 但我想你可以創建自己的查詢並使用本機查詢來執行與a.id = b.aId的連接。

0

您必須使用@JoinColumn(name = "a_id")而不是@PrimaryKeyJoinColumn。順便說一句,你不能在同一列上定義兩個字段。但是,如果你需要的話,你必須讓他們中的一個不可插入和不可更新這樣的:

@JoinColumn(name = "a_id", insertable = false, updatable = false) 
+0

感謝Mehdi ...它的工作:) –