日期:2014-05-20  浏览次数:20712 次

jpa+hibernate一对多双向关联关系更新问题
就好比订单(Order)和订单项(OrderItem)
订单一的一方,订单项是多的一方
原本订单A里面有四个订单项(1,2,3,4)
现在有一个订单项不要了(4),最终只保留(1,2,3)
费了半天劲也没有保存成功为什么
请大牛指点江山

------解决方案--------------------
JPA规范是不支持级联删除, 不过一般实现方都会提供扩展功能来支持。 
如果你用的是toplink实现包的话, 你就要实现一个DescriptorCustomizer 接口 

public class AccountDescriptorCustomizer implements DescriptorCustomizer { 

public void customize(ClassDescriptor descriptor) throws Exception { 
OneToManyMapping mapping = (OneToManyMapping) descriptor.getMappingForAttributeName("acct2groups"); 
if (mapping != null) mapping.setIsPrivateOwned(true); 


然后在persistence.xml 中properties节点下加入: 
<property name="toplink.descriptor.customizer.包名.Account" value="包名.AccountDescriptorCustomizer"/> 

最后Acct2group 中 @ManyToOne 属性cascade将CascadeType.ALL 改成 {CascadeType.REFRESH, CascadeType.MERGE, CascadeType.MERGE}. 

如果是hibernate的实现的话, 在@OneToMany 
旁边加上: @org.hibernate.annotations.Cascade(org.hibernate.annotations.CascadeType.DELETE_OPTION) 


--------------------------------------------