hibernate-级联cascade="all-delete-orphan"
关于cascade="all-delete-orphan"
通俗来讲就是级联删除,当一对多的情况下,父节点删除子节点相应删除操作。其他类似更新操作也受此影响,因为此对象如果已经持久化在缓存中,对其进行操作就需要考虑其持久化一致性问题。
以下为个人对持久对象进行拷贝所遇到的问题以及过程:
1. 当首先对其对象进行拷贝时,考虑到hibernate的特性,将PK 置为空,然后进行saveOrUpdate操作,但其出现异常:
Don't change the reference to a collection with cascade="all-delete-orphan"
不能对其集合进行操作,在级联删除的情况下,原因为:如果对象已经存在于该持久化中,其中的关联SET也在持久化中,对其父节点对象更改PK后,子节点的由于找不到该对象并且原持久内容与之不符合。
解决方案:由于持久化中每个对象有相应的ID进行标识,并且对象均属于引用类型,所以若要拷贝对象并且用于插入数据库操作,建议使用对象克隆的方式,若有set类型的子节点,建议首先将其置空,之后使用ArraySet继续添加"克隆"的子节点对象,对于插入数据库就将其PK置空,添加父节点为克隆后的对象,即可使用saveOrUpdate方法进行操作。
以上为个人愚见,如有差错望予以了解并更正。