程序执行到下面 的“保存客户退货单商品”时报错了
/*保存客户退货单 以及该客户退货单对应的客户退货单商品
* (non-Javadoc)
*
*/
@Override
public void save(CustomerReturnList customerReturnList, List<CustomerReturnListGoods> customerReturnListGoodsList) {
for(CustomerReturnListGoods customerReturnListGoods : customerReturnListGoodsList) {
customerReturnListGoods.setType(goodsTypeRepository.getOne(customerReturnListGoods.getTypeId()));//设置商品类别
customerReturnListGoods.setCustomerReturnList(customerReturnList); //设置客户退货单
customerReturnListGoodsRepository.save(customerReturnListGoods);//保存客户退货单商品
// 退货后 修改商品库存 修改商品的状态(发生单据)
Goods goods = goodsRepository.findOne(customerReturnListGoods.getGoodsId());
goods.setInventoryQuantity(goods.getInventoryQuantity()+customerReturnListGoods.getNum());
goods.setState(2);
goodsRepository.save(goods);
}
customerReturnListRepository.save(customerReturnList);//保存客户退货单
}
org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing : com.java1234.entity.CustomerReturnListGoods.customerReturnList -> com.java1234.entity.CustomerReturnList
由于在向数据库保存对象的时候,该对象还有一个外键,外键其实是另一个实体,这个实体缺少主键或主键为空的话就会报这个错!
解决方法:配置cascade关键字,级联操作。
JPA 中定义了四种 CASCADE 类型:
* PERSIST:持久保存拥有方实体时,也会持久保存该实体的所有相关数据。
* MERGE:将分离的实体重新合并到活动的持久性上下文时,也会合并该实体的所有相关数据。
* REMOVE:删除一个实体时,也会删除该实体的所有相关数据。
* ALL:以上都适用。
具体使用见下图: