我有一个名为Sale
的实体,其中包含对象列表SaleData
,我在这两个实体之间建立了单向@OneToMany
关系。现在我在Sale对象上进行CRUD操作时遇到了问题。
CascadeType
设置为ALL
。
@Entity
@Table(name = "sale")
public class Sale extends BaseEntity {
@OneToOne(cascade = CascadeType.DETACH)
private Client client;
@OneToMany(cascade = {CascadeType.ALL}) // <--
@JoinColumn(name = "sale_id", nullable = false)
private List<SaleData> saleData = new ArrayList<>();
}
保存(POST)和删除工作。造成问题的原因是POST更新时,我从Angular控制器发送的JSON看起来像这样:
{"id": 1, "client": {
"id": 1,
"firstName": "Test",
"lastName": "Client"
}, "saleData": [
{
"id": 1,
"employee": {
"id": 1,
"firstName": "Herp",
"lastName": "Derp"
}
},
{
"id": 2,
"employee": {
"id": 1,
"firstName": "John",
"lastName": "Smith"
}
}
]}
来自Spring服务的更新调用抛出:
org.hibernate.PersistentObjectException: detached entity passed to persist: app.sales.SaleData
服务实施
@Override
@Transactional(rollbackFor = SaleNotFoundException.class)
public Sale update(@NotNull SaleDTO updated) {
Sale sale = repository.findOne(updated.getId());
if (sale == null)
throw new SaleNotFoundException("Sale not found");
return transformSaleObject(sale, updated);
}
据我了解,cascade ALL不会使销售对象Deattached,因为在第二种情况下我用任意组合替换类型...
@OneToMany(cascade = {CascadeType.PERSIST, CascadeType.REMOVE, CascadeType.DETACH})
..然后更新和删除有效,但保存新对象却不起作用。我没有那么多使用Hiberate,但也许有人知道是什么导致了这种行为?这是以错误的方式定义关系的问题吗?
更新 变换方法就是这样,但无论如何看起来它现在都解决了我的问题:)
private Sale transformSaleObject(Sale sale, SaleDTO dto) {
sale.setClient(dto.getClient());
sale.setSaleData(dto.getSaleData());
sale.setService(dto.getService());
sale.setHours(dto.getHours());
sale.setPrice(dto.getPrice());
sale.setSaleStatus(dto.getSaleStatus());
sale.setSaleDate(dto.getSaleDate());
return sale;
}
我更改了我的更新方法如下:
public Sale update(@NotNull SaleDTO updated) {
Sale sale = repository.findOne(updated.getId());
if (sale == null)
throw new SaleNotFoundException("Sale not found");
transformSaleObject(sale, updated);
return repository.saveAndFlush(sale);
}