gpt4 book ai didi

java - merge() 操作中丢失复合外键 (JPA/Hibernate)

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:40:24 24 4
gpt4 key购买 nike

想象一个 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/

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