2017-08-09 106 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 ...它的工作:) –