У меня есть Сотрудник и Функции, классы банка Сотрудник и Функция имеют отношение @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)