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

标签 java hibernate orm jpa jakarta-ee

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

相关文章:

JavaFX ScrollPane 不随 VBox 滚动

java - 如何将代理与优先级范围关联 Anylogic

java - 为什么 Integer 在 Java 中不代表 NaN?

java - hibernate 子查询抛出空指针异常

java - JPA 2 和 Hibernate 之间有什么关系?

java - 如何扩展@Entity

java - JPanel 无法正确绘制

java - 找不到 EntityManager Apache Deltaspike

java - Hibernate 在创建后立即加载对象

database - 维基百科说 ORM 只是进行类型转换而不一定传输数据,这是错误的吗?