JPA JoinColumns поведение - PullRequest
       3

JPA JoinColumns поведение

1 голос
/ 06 ноября 2019
class Employee {

   @EmbeddedId
   private EmployeeId id; // composite key with two fileds companyId and employeeNumber

   @OneToMany(mappedBy = "employee", cascade = CascadeType.ALL)
   private List<Phone> phoneList;
}

class Phone {

  @EmbeddedId
  private PhoneId phoneId; // composite key with three fileds companyId , employeeNumber and phoneNumber

  @ManyToOne
  @JoinColumns({
        @JoinColumn(name = "COMPANY_ID", referencedColumnName = "COMPANY_ID", insertable = false, 
        updatable = false),
        @JoinColumn(name = "EMPLOYEE_NUMBER_NEW", referencedColumnName = "EMPLOYEE_NUMBER", 
        insertable = false, updatable = false)})
  private Employee employee;

}

В приведенном выше примере таблица Employee создается с помощью столбца employeeId, employeeNumber. И таблица Phone создается с помощью employeeId, employeeNumber, phoneNumber, employee_nuber_new.

Когда я создаю объект employee и объект phone, в конце значения employeeId и employeeNumber в таблице Phone заполняются из объекта Employee (как часть FK) но столбец employee_number_new по-прежнему имеет нулевое значение. Я хочу обновить столбец employee_number_new, указав employeeNumber из таблицы Employee.

Испытано множество способов, включая JoinFormula и все, но безуспешно. Кто-нибудь может пролить свет на это?

Спасибо ...

1 Ответ

1 голос
/ 06 ноября 2019

Причина, по которой вы получаете значение null в таблице Телефон, потому что вы используете insertable = false в своем определении JoinColumn. Если бы вы могли установить значение true, то ваша проблема была бы решена.

Hibernate не поддерживает смешивание вставляемых и не вставляемых столбцов. Таким образом, вы также должны сделать companyId вставляемым. Но это приводит к возможности изменения вашего первичного ключа в таблице Phone, которая вам не нужна.

Итак, у нас остается два варианта, если EMPLOYEE_NUMBER одинаков в обеих таблицах, не создавайте новый столбец EMPLOYEE_NUMBER_NEW столбец и используйте EMPLOYEE_NUMBER.

Ноесли EMPLOYEE_NUMBER не совпадает в обеих таблицах, и вам необходимо сохранить номер сотрудника из объекта сотрудника, создать еще один вставляемый столбец, это может быть COMPANY_ID_EMP и сделать обновляемым значение false. Таким образом, при сохранении объекта телефона будут сохранены как EMPLOYEE_NUMBER_NEW, так и COMPANY_ID_EMP. Но на практике COMPANY_ID_EMP и COMPANY_ID будут одинаковыми значениями.

Следующий код работал для меня

    @ManyToOne
    @JoinColumns({
            @JoinColumn(name = "companyIdEmp", referencedColumnName = "companyId",  updatable = false),
            @JoinColumn(name = "employeeNumberNew", referencedColumnName = "employeeNumber", updatable = false)})
    private Employee employee;
...