JPA-Hibernate:具有相同标识符值的不同对象已经与会话关联



我为一个人使用两个地址,即当前地址和永久地址。每个地址都有一个地区。我在前端的下拉列表中显示了一个地区列表,这样用户就可以在其中选择一个地区。所以这种情况一定是一个人有现在和永久地址相同的情况发生。因此,可以为两个地址选择两个相同的地区。

现在开门见山。如果一个为两个地址设置了相同的区域,JPA-Hibernate会显示一个错误,因为同时更新两个相同的区域。

nested exception is javax.persistence.EntityExistsException: A different object with the same identifier value was already associated with the session

Person.java

@Table(name = "person")
public class Person implements Serializable {
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER, optional = true)
@JoinColumn(name = "permanent_adrs_id", referencedColumnName = "id")
private Address permanentAddress;
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER, optional = true)
@JoinColumn(name = "present_adrs_id", referencedColumnName = "id")
private Address presentAddress;
}

地址.java

@Table(name = "address")
public class Address implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String village;
@ManyToOne(fetch = FetchType.EAGER, optional = true)
@JoinColumn(name = "district_id", referencedColumnName = "id")
private District district;
}

地区.java

@Table(name = "district")
public class District implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String name;
}

我的猜测是,您有两个DistrictAddress对象,它们对id具有相同的值,但却是不同的对象,即obj1 != obj2

这在JPA中是非法的。通常的解决方案是加载从其他对象引用的对象。

例如,这样做:

Person p = ...
p.getPermanentAddress().setDistrict(
entityManager.find(District.class, p.getPermanentAddress().getDistrict().getId())
);
p.getPresentAddress().setDistrict(
entityManager.find(District.class, p.getPresentAddress().getDistrict().getId())
);
repository.save(p);

最新更新