hibernate中collection该何时使用cascade

先说说cascade的取值:如果用save-update,只是对存储过程和更新过程级联,在删除数据的时候,引用表的外键为空,不做级联删除,而用delete的话时,在对父表操作时,同时级联所有的更新操作和删除操作,也就是说在删除父表时同时删除子表中引用父表pk做外键的项,但是和内存中不同步.all-delete-orphan可以和内存中数据做同步. 再说说应用场合:

BookType bookType = new BookType();

Book book1 = new Book();

 book1.setType(bookType);

 Book book2 = new Book();

book2.setType(bookType);

bookService.save(book1);

 bookService.save(book2);

先创建一个 “书本类” 的实例,再创建 2本书,都是属于这本书,保存这2本书,结果出错。为什么?因为没有把BookTpye保存,所以那2本书的类别字段就不能保存了。这时使用cascade就可以保存book的时候自动保存booktype。 当然,还有另一种应用场合,就是booktype是预定义的,不是用户新创建的。这个时候无论book的增加还是删除,都不应当影响booktype,因此不能增加cascade属性。在appfuse当中,user的定义:

        <set
            name="roles"
            table="user_role"
            lazy="false"
            cascade="save-update"
        >
由于role都是预定义的,所以这里使用cascade并不妥当,某些应用场合可能会造成异常。(在role重新保存的时候,可能会报id相同无法保存)

 

你可能感兴趣的:(Hibernate,Appfuse)