gpt4 book ai didi

java - 为什么我通过 JoinTable 进行的 OneToOne 映射不起作用?

转载 作者:行者123 更新时间:2023-11-30 03:17:03 25 4
gpt4 key购买 nike

我已经搜索过,但似乎找不到答案。

我有两个表:

select ts_id, tsjoin_id, workdate from TimeSheets
select e_id, lastname from Employees

我还有一个连接表:

TSJoin
tsjoin_id, employee_id

考勤表中只有一名员工。因此,对于任何给定的 TimeSheet 实体,我希望能够:

TimeSheet ts = tsService.getTimeSheet(123);
String lastName = ts.getEmployee().getLastName();

在 SQL 中,获取 TimeSheet 的员工:

select e.lastname from TimeSheets t
join TSJoin x on (x.tsjoin_id = t.tsjoin_id)
join Employees e on (e.e_id = x.employee_id)
where t.ts_id = 123

在我的 Hibernate 映射中,我有:

@OneToOne
@JoinTable(
name = "TSJoin",
joinColumns = {
@JoinColumn(name = "tsjoin_id", nullable = false)
},
inverseJoinColumns = {
@JoinColumn(name = "e_id", nullable = false)
}
)

但是,它生成的 SQL 是:

select * from TimeSheet t
left outer join TSJoin x on (t.ts_id = x.tsjoin_id)

它为员工返回 null。

它采用 TimeSheet 的主键并尝试匹配连接表的主键。

我做错了什么?

编辑

我还想声明,我此时只设置了一个方向。这是一个 TimeSheet -> Employee (OneToOne),并且 Employee 尚未映射到 TimeSheet 尚未。不确定这是否有什么不同,但我想提一下。

编辑2我还想声明,我认为该错误可能是因为我的联接表不包含对 TimeSheet 的引用。 Hibernate 假设连接表将包含所涉及的每个实体(遗留数据库)的主键。我可能可以创建 TimeSheet -> JoinTable -> Employee 的映射并将其访问为: ts.getJoin().getEmployee () 但这非常难看。

最佳答案

默认情况下,假定连接表包含两个连接实体的 ID。

在您的情况下,情况并非如此:TimeSheet 实体的 ID 映射到 ts_id列,但您希望连接表有一列是 tsjoin_id 的外键列而不是 ts_id .

所以你需要将其告诉 Hibernate。它猜不出来。还有javadoc of JoinColumn说:

referencedColumnName

(Optional) The name of the column referenced by this foreign key column. [...]

Default (only applies if single join column is being used): The same name as the primary key column of the referenced table.

所以你需要的是

@JoinTable(
name = "TSJoin",
joinColumns = {
@JoinColumn(name = "tsjoin_id", nullable = false, referencedColumnName = "tsjoin_id")
},
inverseJoinColumns = {
@JoinColumn(name = "e_id", nullable = false)
}
)

请注意,每个时间表只有一名员工不足以使您的关联成为一对一。要成为一对一,每位员工还应该有一份时间表。事实上,如果一名员工有多个时间表,则该关联是多对一,而不是一对一。

关于java - 为什么我通过 JoinTable 进行的 OneToOne 映射不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32317162/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com