Hibernate ManyToMany добавляет ценность, когда существует в другой таблице
У меня есть таблицы с отношениями @ManyToMany. Я получаю исключение "отдельная сущность передана для сохранения", когда я пытаюсь добавить значение в таблицы Employees.First я создал некоторые данные в Outpost. Как добавить сотрудника? Вот мой код
Сотрудники
@Entity
@Table(name = "Employees")
public class EmployeeEntity {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
@Column(name = "employee_id", nullable = false)
private Integer employeeId;
@Column
private String name;
@Column
private String sureName;
@Column
private Long liferayUserId;
@Column
private String phone;
@Column
private String email;
@ManyToMany(cascade = { CascadeType.ALL })
@JoinTable(name = "Employee_Outpost", joinColumns = { @JoinColumn(name = "employee_id") }, inverseJoinColumns = { @JoinColumn(name = "outpost_id") })
private List<OutpostEntity> outposts;
застава
@Entity
@Table(name = "Outpost")
public class OutpostEntity implements Serializable {
/**
*
*/
private static final long serialVersionUID = -7782359215536098452L;
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
@Column(name = "outpost_id", nullable = false)
private Integer outpostID;
@Column
private String province;
@Column
private String city;
@Column
private String postCode;
@Column
private String street;
@Column
private String phone;
@Column
private String openingHours;
@OneToMany(mappedBy = "outpostID", fetch = FetchType.EAGER)
private Set<ShipperEntity> shippers;
@ManyToMany(mappedBy = "outposts", cascade = CascadeType.MERGE, fetch = FetchType.EAGER)
private Set<EmployeeEntity> employees = new HashSet<EmployeeEntity>();
@OneToMany(mappedBy = "outpost", fetch = FetchType.LAZY)
private Set<AreaEntity> areas = new HashSet<AreaEntity>();
функция
EmployeeEntity employee = new EmployeeEntity(model.getName(),
model.getSurename(), model.getPhone(), model.getEmail(),
newUserId, outposts);
employeeJpaRepository.save(employee);
1 ответ
Вы столкнулись с PersistentObjectException
потому что ваш outposts
находится в отсоединенном состоянии. Вызвать employeeJpaRepository.merge(outposts);
прежде чем вызывать employeeJpaRepository.save(employee);
поможет.
Представление о merge()
:
Скопируйте состояние данного объекта на постоянный объект с тем же идентификатором. Если в данный момент нет постоянного экземпляра, связанного с сеансом, он будет загружен. Вернуть постоянный экземпляр. Если данный экземпляр не сохранен, сохраните копию и верните ее как новый постоянный экземпляр. Данный экземпляр не становится связанным с сеансом. Эта операция распространяется на связанные экземпляры, если сопоставление сопоставлено с помощью cascade="merge".