Составной внешний ключ потерян в операции слияния () (JPA / Hibernate) - PullRequest
3 голосов
/ 10 сентября 2010

Представьте себе объект Employee, который ссылается на Department, используя составной ключ :

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

В компоненте сеанса без сохранения состояния я связываю сотрудника с отделом с помощьюустановка соответствующего атрибута:

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=?

Надеюсь, я пропустил что-то тривиальное ...

1 Ответ

2 голосов
/ 14 сентября 2010

Стреляй в меня!

Как я уже говорил, я составил приведенный выше фрагмент кода 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

Прости!

П.С .: Тем не менее, я озадачен, почему это сработало в моих модульных тестах, а не на сервере приложений

...