Hibernate ManyToMany在另一个表中存在时添加值

时间:2015-02-02 13:21:55

标签: hibernate nhibernate-mapping spring-data

我有@ManyToMany关系的表格。当我尝试在表Employees中添加值时,我得到异常“分离的实体传递给持久化”。首先我在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 个答案:

答案 0 :(得分:0)

您遇到了PersistentObjectException,因为您的outposts处于分离状态。在调用employeeJpaRepository.merge(outposts);之前调用employeeJpaRepository.save(employee);会有所帮助。

merge()的介绍:

  

使用。将给定对象的状态复制到持久对象上   相同的标识符如果当前没有持久化实例   与会话相关联,它将被加载。返回持久性   实例。如果给定实例未保存,请保存副本并返回   它作为一个新的持久化实例。给定的实例不会成为   与会话相关联。此操作级联到相关联   如果关联是使用cascade =&#34; merge&#34;。

映射的实例