合并外键在merge()操作中丢失(JPA / Hibernate)

时间:2010-09-10 13:12:15

标签: java hibernate orm jpa java-ee

想象一下使用复合键引用Employee的{​​{1}}实体:

Department

在无状态会话Bean中,我通过设置适当的属性来将Employee与Department关联:

@Entity
public class Employee {
   ...
   @ManyToOne
   @JoinColumns({
      @JoinColumn(name="dept_country", referencedColumnName="country"),
      @JoinColumn(name="dept_id", referencedColumnName="id")
   })
   private Department dept;
   ...

=> 部门外,所有属性都已正确保存(更新)到数据库中。

我想知道这是否与复合键有关,因为当我在后台查看Hibernate SQL时,正好缺少那些外键列。

employee.setAbc(abc);
System.out.println(entityManager.contains(aDepartment)));  //true
employee.setDepartment(aDepartment);
employee.setXyz(xyz);
entityManager.merge(employee);

我希望我错过了一些微不足道的事情......

1 个答案:

答案 0 :(得分:2)

拍我!

正如我所提到的,我编写了上面的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:不过,我很困惑为什么它在我的单元测试中工作而不是在App Server中工作