我有实体 FooDetails,它有两个字段:客户和位置列表。Customer 有 Address(@OneToOne 单向映射),Location 也有 Address 和 @OneToOne 映射。
碰巧“客户”中的“地址”和“位置”中的“地址”是相同的。所有这些对象都来自远程服务,我在保存之前手动将远程对象的 ID 放入实体中。映射如下所示:
@Entity
@Table(name = "FOO")
public class FooDetails {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private long id;
@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "customer_id")
private Customer customer;
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "details_id")
private Set<Location> locationList;
...
}
@Entity
@Table(name = "CUSTOMER")
public class Customer {
@Id
@Column(name = "customer_id", unique = true)
private long customerId;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "address_id")
private Address address;
...
}
@Entity
@Table(name = "LOCATION")
public class Location {
@Id
@Column(name = "location_id", unique = true)
private long locationId;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "address_id")
private Address address;
...
}
@Entity
@Table(name = "ADDRESS")
public class Address{
@Id
@Column(name = "address_id")
private long addressId;
...
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof StawareAddress)) return false;
StawareAddress that = (StawareAddress) o;
return addressId == that.addressId;
}
@Override
public int hashCode() {
return (int) (addressId ^ (addressId >>> 32));
}
}
当我从 webservice 收到整个 FooDetails 对象时,我尝试将它保存到本地数据库。
如果数据库是干净的(还没有保存地址),则保存一个来自 WS 的具有正确 id 的地址。如果已经有一个具有此 id 的地址,Hibernate 会尝试将新地址插入数据库,并且由于 addressId 上的唯一约束而出现错误。
我正在使用 Spring Data Jpa 来保存实体(save() 方法)。
我错过了什么明显的实体映射问题?
我实际上不鼓励使用CascadeType.ALL
here并手动处理它。
public void saveFoodetails(FooDetails fooDetails) {
Address address = addressRepository.find( fooDetails.getAddress().getId() );
if ( address != null ) {
// perhaps you update address with data from fooDetails.getAddress()
addressRepository.save( address );
// associate attached address instance with fooDetails now.
fooDetails.setAddress( address );
}
else {
// save the new incoming address contained in FooDetails
addressRepository.save( fooDetails.getAddress() );
}
// now save/update FooDetails
fooDetailsRepository.save( fooDetails );
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句