使用主键休眠一对一联接不起作用



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

我做了与下面提到的链接中提到的相同 使用主键连接列进行一对一映射

但是,当我执行以下 hql 查询时,

"from A a left join a.b"

在以下条件下进行联接

a.id = b.id 

虽然我想要的是以下条件

a.id = b.aId

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

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

您已经将类 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;

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

最新更新