как обновить Двунаправленные отношения @OneToMany - PullRequest
0 голосов
/ 26 мая 2019

У меня есть Сотрудник и Функции, классы банка Сотрудник и Функция имеют отношение @OneToMany, а Сотрудник и Банк также имеют отношение @OneToMany.если пользователь редактирует форму и меняет функцию и / или банк, я хочу обновить отношения.но когда я изменяю отношение, я получаю исключение Duplicate entry из-за уникальности столбца, потому что объект Employee сохранился как новый объект

Я попытался удалить сотрудника из функции и установить для функции сотрудника значение null иполучить новую функцию и добавить к ней сотрудника и установить новую функцию, но она не работает.Любая идея, пожалуйста

@Entity
public class Employee extends GeneratedIdEntity<Long> {       
   @ManyToOne(optional = false)
   private Functions function;

   @ManyToOne(optional = false)
   private Bank bank;

   @OneToMany(
           mappedBy = "employee",
           fetch = LAZY,
           cascade = ALL,
           orphanRemoval = true
   )
   private List<RubricValue> rubricsValues = new ArrayList<>();

   @OneToMany(
           mappedBy = "employee",
           fetch = LAZY,
           cascade = ALL,
           orphanRemoval = true
   )
   List<EmployeeStatus> employeesStatus=new ArrayList<>();
}
@Entity
public class Functions extends GeneratedIdEntity<Long>{
    @OneToMany(
            mappedBy = "function",
            fetch = LAZY,
            cascade = ALL,
            orphanRemoval = true
    )
    private List<Employee> employees=new ArrayList<>();    

    public void addEmployee(Employee employee ){
        employees.add(employee);
    }
    public void removeEmployee(Employee employee){
        employees.remove(employee);
    }    
}
@Entity
public class Bank extends GeneratedIdEntity<Long> {
   @OneToMany(
           mappedBy = "bamk",
           fetch = LAZY,
           cascade = ALL,
           orphanRemoval = true
   )
   private List<Employee> employees = new ArrayList<>();

   public void addEmployee(Employee employee ){
       employees.add(employee);
   }
   public void removeEmployee(Employee employee){
       employees.remove(employee);
   }
}
@Stateless
public class EmployeeService extends BaseEntityService<Long, Employee> {
    @Inject
    FunctionService functionService;

    @Inject
    BankService bankService;

    public void update(Employee employee, String newFunctionName, String newBankName) {
        if (!employee.getBank().getName().equals(newBankName)) {
            employee.getBank().removeEmployee(employee);
            employee.setBank(null);
            Bank newBank = bankService.getByName(newBankName);
            newBank.addEmployee(employee);
            employee.setBank(newBank);

        }
        if (!employee.getFunction().getName().equals(newFunctionName)) {
            employee.getFunction().removeEmployee(employee);
            employee.setFunction(null);
            Functions newFunction = functionService.getByName(newFunctionName);
            newFunction.addEmployee(employee);
            employee.setFunction(newFunction);

        }
    }   
}

трассировка стека исключений. Вызвано: java.sql.SQLIntegrityConstraintViolationException: дублирующаяся запись 'dkfhks32' для ключа 'REGISTRATIONNUMBER' в com.mysql.cj.jdbc.exceptions.SQLError.createSQLException (SQLError.java:115) при com.mysql.cj.jdbc.exceptions.SQLError.createSQLException (SQLError.java:95) при com.mysql.cj.jdbc.exceptions«com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal (ClientPreparedStatement.java:1066) по адресу com.mysql.cj.jdbc.ClientPreparedStatement.executeLargeUpdate (ClientPreparedStatement.exys.rep.jp.jp_t_p_d_c_t_p_d_p0_0_0_0_p_p_p_p_s_e_p0_0_p0_0_r_r_r_r_r_r.)ClientPreparedStatement.java:1051) на com.sun.gjc.spi.base.PreparedStatementWrapper.executeUpdate (PreparedStatementWrapper.java:127) в sun.reflect.GeneratedMethodAccessor54.invoke (Неизвестный источник) в sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.Java: 498) в com.sun.gjc.spi.jdbc40.ProfiledConnectionWrapper40 $ 1.invoke (ProfiledConnectionWrapper40.java:437) в com.sun.proxy. $ Proxy268.executeUpdate (Неизвестный источник) в org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeDirectNoSelect (DatabaseAccessor.java:898)

1 Ответ

0 голосов
/ 26 мая 2019

Вам не нужно менять bank для employee, сначала удалив ссылку на существующий банк. Вы можете просто пойти:

if (!employee.getBank().getName().equals(newBankName)) {
    Bank newBank = bankService.getByName(newBankName);
    //You must also do an entity validation/null check here. The newBank might not be present after all.
    employee.setBank(newBank);       
}

Это обновит сопоставления правильно. То же самое касается обновления function employee

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...