• Hibernate中级联操作cascade选项


    Hibernate中级联操作cascade选项<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

     

    none:在保存、更新或删除对象时,忽略其他关联的对象。他是cascade属性的默认值。

    save-update:当通过Sessionsave()update()以及saveOrUpdate()方法保存或更新当前对象是,级联保存所有关联的新建的临时对象,并且级联更新所有关联的游历对象。

    delete:当通过Sessiondelete()方法删除当前的对象是,级联删除所有关联的对象。

    all:包含save-update以及delete的行为。此外,对当前对象执行evict()lock()操作时,也会对所有关联的持久话对象执行evict() lock()操作。

    delete-orphan:删除所有和当前对象解除关联关系的对象。

    all-delete-orphan:包含all delete-ophan

     

    注意,很多人在使用Session对象的delete()方法时,设置了<set cascade=”delete”>,如下示例删除图书的一个分类:

    Category c = new Category();

    c.setId(11);

    session.delete(c);

    结果没有任何动静,那是因为删除操作没有放在一个事务里面。

    Transaction tran = session.beginTransaction();

    Category c = new Category();

    c.setId(11);

    session.delete(c);

    tran.commit();

    加了事务后,能够删除分类表的数据了。但是对应此分类的图书的数据却只是将关联的分类ID修改为了null,并没有真正删除。这是为什么呢?主要就是因为我们这里的Category对象只是一个临时对象。它在删除之前会被持久化,但它所关联的图书对象却不会被自动持久化。那如何是好?我们修改一下实现代码:

    Transaction tran = session.beginTransaction();

    Category c = (Category) session.get(Category.class, 11);

    session.delete(c);

    tran.commit();

    这样子就能够级联删除分类和此分类下的图书数据了。

  • 相关阅读:
    BZOJ 4318: OSU!
    BZOJ 3450: Tyvj1952 Easy
    BZOJ 1426: 收集邮票
    BZOJ 1415: [Noi2005]聪聪和可可
    BZOJ 1778: [Usaco2010 Hol]Dotp 驱逐猪猡
    BZOJ 3270: 博物馆
    BZOJ 3143: [Hnoi2013]游走
    BZOJ 3166: [Heoi2013]Alo
    BZOJ 3261: 最大异或和
    BZOJ 1022: [SHOI2008]小约翰的游戏John
  • 原文地址:https://www.cnblogs.com/CharmingDang/p/9663823.html
Copyright © 2020-2023  润新知