Каждый раз, когда я добавляю нового сотрудника в отдел, мне нужно обновить счетчик в сущности отдела для общего количества сотрудников.
Каждый раз, когда добавляется новый сотрудник, я получаю сущность «Отдел» от сущности «Сотрудник» менеджера, обновляю счетчик, а затем устанавливаю сущность «Отдел» для новой сущности «Сотрудник» и вызов метода save() в репозитории Сотрудники с новым объектом Сотрудник. Однако это вызывает у меня ошибку «отсоединенный объект, переданный для сохранения».
У меня для @Cascade установлено значение @Cascade.ALL в поле Department_id в объекте «Сотрудник», который работает, когда добавляется 1-й сотрудник. Отдел создается автоматически. Проблема возникает, когда я пытаюсь получить сущность «Отдел» от существующего сотрудника, прикрепить ее к новому сотруднику и попытаться сохранить новую сущность «Сотрудник».
Код выглядит следующим образом:
Код: Выделить всё
@Entity
@Table(name = "employee")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class EmployeeEntity implements Serializable {
@Id
@SequenceGenerator(name = "employee_id_seq", sequenceName = "employee_id_seq", allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "employee_id_seq")
@Column(name = "id", updatable = false)
private Integer id;
@JdbcTypeCode(SqlTypes.Long)
@Column(name = "employee_id")
private Long employeeId;
@ManyToOne
@Cascade({CascadeType.ALL})
@JoinColumn(name = "department_id", nullable = false)
private DepartmentEntity departmentEntity;
public EmployeeEntity(Long employeeId, DepartmentEntity departmentEntity) {
this.employeeId = employeeId;
this.departmentEntity = departmentEntity;
}
}
Код: Выделить всё
@Entity
@Table(name = "department")
@Data
@NoArgsConstructor
public class DepartmentEntity implements Serializable {
@Id
@SequenceGenerator(name = "department_id_seq", sequenceName = "department_id_seq", allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "department_id_seq")
@Column(name = "id", updatable = false)
private Integer id;
@JdbcTypeCode(SqlTypes.Integer)
@Column(name = "num_employees", nullable = false)
private Integer numEmployees;
}
Код: Выделить всё
// code execution
@Transactional
public void addEmployee(employeeId, managerId) {
Employee manager = empRepository.findById(managerId);
Department empDept = manager.getDepartmentEntity()
empDept.numEmployees++;
Employee associate = new EmployeeEntity(employeeId, empDept);
empRepository.save(associate); // this throws the exception
}
Подробнее здесь: https://stackoverflow.com/questions/796 ... one-asssoc
Мобильная версия