想象一个 Employee
实体,它使用 Compound Key 引用 Department
:
@Entity
public class Employee {
...
@ManyToOne
@JoinColumns({
@JoinColumn(name="dept_country", referencedColumnName="country"),
@JoinColumn(name="dept_id", referencedColumnName="id")
})
private Department dept;
...
在无状态 session Bean 中,我通过设置适当的属性将员工与部门相关联:
employee.setAbc(abc);
System.out.println(entityManager.contains(aDepartment))); //true
employee.setDepartment(aDepartment);
employee.setXyz(xyz);
entityManager.merge(employee);
=> 除了 部门 之外,所有属性都正确保存(更新)到数据库中。
我想知道这是否与复合键有关,因为当我在后台查看 Hibernate SQL 时,正是缺少那些外键列。
14:46:18 INFO [STDOUT#write] Hibernate:
14:46:18 INFO [STDOUT#write] update
14:46:18 INFO [STDOUT#write] employees
14:46:18 INFO [STDOUT#write] set
14:46:18 INFO [STDOUT#write] abc=?,
14:46:18 INFO [STDOUT#write] xyz=?,
14:46:18 INFO [STDOUT#write] where
14:46:18 INFO [STDOUT#write] id=?
我希望我错过了一些微不足道的事情......
最佳答案
向我开枪!
如前所述,我编写了上面的 Employee
/Department
代码片段来阐明我的案例。我不应该这样做!我省略了一个关键元素:updatable
标志
实际上,我的情况如下所示:
@ManyToOne
@JoinColumns({
@JoinColumn(name="dept_country", referencedColumnName="country", insertable = false, updatable = false),
@JoinColumn(name="dept_id", referencedColumnName="id", insertable = false, updatable = false)
})
问题的答案很明显:切换到 updatable = true
对不起!
P.S:仍然,我很困惑为什么它在我的单元测试中起作用,而不是在应用服务器中起作用
关于java - merge() 操作中丢失复合外键 (JPA/Hibernate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3684842/