使用主键无法正常进行一对一连接

时间:2017-08-09 12:23:06

标签: java hibernate join one-to-one

我在休眠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

2 个答案:

答案 0 :(得分:1)

您必须使用@JoinColumn(name = "a_id")代替@PrimaryKeyJoinColumn。 顺便说一句,您无法在同一列上定义两个字段。但是,如果您需要这样做,您必须使其中一个不可插入且不可更新,如下所示:

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

答案 1 :(得分:0)

您已将A类的引用提供给B类中的字段a。

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

B级到A级的b区

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

所以默认情况下,Hibernate使用引用字段创建连接查询。因此,默认情况下,hibernate会在a.id = b.id上执行连接。 但我认为您可以创建自己的查询并使用本机查询来执行与a.id = b.aId的连接。