惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Forbes - Security
Forbes - Security
GbyAI
GbyAI
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
S
SegmentFault 最新的问题
Y
Y Combinator Blog
Recorded Future
Recorded Future
博客园 - Franky
I
InfoQ
T
The Blog of Author Tim Ferriss
Recent Announcements
Recent Announcements
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
博客园_首页
阮一峰的网络日志
阮一峰的网络日志
T
Tailwind CSS Blog
Cyberwarzone
Cyberwarzone
The Register - Security
The Register - Security
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
雷峰网
雷峰网
P
Palo Alto Networks Blog
G
GRAHAM CLULEY
Cloudbric
Cloudbric
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
MongoDB | Blog
MongoDB | Blog
F
Full Disclosure
Google DeepMind News
Google DeepMind News
Recent Commits to openclaw:main
Recent Commits to openclaw:main
C
Check Point Blog
爱范儿
爱范儿
The GitHub Blog
The GitHub Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
W
WeLiveSecurity
T
Threat Research - Cisco Blogs
U
Unit 42
N
Netflix TechBlog - Medium
The Cloudflare Blog
Spread Privacy
Spread Privacy
Microsoft Azure Blog
Microsoft Azure Blog
美团技术团队
T
Troy Hunt's Blog
Engineering at Meta
Engineering at Meta
H
Heimdal Security Blog
TaoSecurity Blog
TaoSecurity Blog
C
Cybersecurity and Infrastructure Security Agency CISA
T
Tenable Blog
B
Blog
S
Securelist
H
Hacker News: Front Page
Google Online Security Blog
Google Online Security Blog
G
Google Developers Blog

博客园 - 磊

淘宝店铺开业送优惠券 报表统计查询 Word 发布测试 关于23种设计模式的有趣见解[转] 用Visual C#调用Windows API函数 DataGrid,GridView和DetailsView中添加删除确认提示 2.0新控件 Localize ASP.NET直接下载一个文件 - 磊 - 博客园 dFastlog.dll错误和数据库连接错误的解决办法 "Automation 服务器不能创建对象" 的解决方法 - 磊 "FSO"的禁用与启用 如何做最简单的url跳转 我的主页 更换SQL对象属主的方法 如何在WinXP中批量修改文件名? Nokia 中的暂停功能 利用Forms实现两种不同验证系统 Froms验证 改版网站真麻烦
【原创】hibernate中delete的一点见解
· 2008-01-22 · via 博客园 - 磊

需求:
    1.有两个类父类Parent和子类Child
    2.添加父类的时候同时添加子类
    3.删除父类时同时删除子类
    4.父类下子类的个数可能较多

Parent parent = new Parent();
 parent.setId(new Long(3));

 parent.setName("parent1");

1 . session.save(parent);

parent的id为重新生成的1

2 . session.persist(parent);

 报PersistentObjectException: detached entity passed to persist: com.css.wwl.hibrelationaldb.cascade.Parent

去掉setId后save和persist都能保存

            session.persist(parent);
            session.persist(parent);
            session.save(parent);
            session.save(parent);

    和

            session.save(parent);
            session.save(parent);

            session.persist(parent);
            session.persist(parent);

    结果一样 最终保存一个Parent 对象

persist的级联关联为 persist

save的级联关联为 save-update

 save中即使是新的对象为什么也没有persist级联通知?
 

 session.delete(parent);

如果parent的children已经初始化(包括之前同一session中执行parent= (Parent) session.load(Parent.class,parent.getId());),

若parent的cascade含有delete或delete-orphan

则:update Child  set parentId=null  where parentId=?

    delete from Child where id=?

    delete from Parent where id=?

否则只执行:

    update Child  set parentId=null  where parentId=?

    delete from Parent where id=?

如果parent的children没有初始化,同样只执行

    update Child  set parentId=null  where parentId=?

    delete from Parent where id=?

不会对Child进行删除

即使cascade为none 同样会执行 update Child  set parentId=null  where parentId=?

cascade为delete-orphan 并不会删除Child中parentId为null的对象

要想简单高效的级联删除可以手工写HSQL如下:

  String deleteChildrenSql="delete from "+ Child.class.getName()+" where parent.id = :parent";

 session.createQuery(deleteChildrenSql)
          .setParameter("parent",parent.getId()).executeUpdate();
       //  session.delete(parent);
        String deleteParentSql="delete from "+ Parent.class.getName()+ " as    parent where parent.id = :id";
         session.createQuery(deleteParentSql)
                 .setParameter("id",parent.getId())
                 .executeUpdate();

执行的sql为:

     delete from Child where parentId=?

     delete from Parent where id=?

where parent.id = :parent可以写成where parentId = :parent(参数传parent.getId())

或 where parent = :parent(参数传parent)

 

附:

Transitive persistence