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".

Другие вопросы по тегам