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

推荐订阅源

V
Visual Studio Blog
P
Privacy International News Feed
C
Cyber Attacks, Cyber Crime and Cyber Security
腾讯CDC
T
Threatpost
D
Darknet – Hacking Tools, Hacker News & Cyber Security
C
CERT Recently Published Vulnerability Notes
大猫的无限游戏
大猫的无限游戏
Apple Machine Learning Research
Apple Machine Learning Research
美团技术团队
Cisco Talos Blog
Cisco Talos Blog
C
Cisco Blogs
A
Arctic Wolf
人人都是产品经理
人人都是产品经理
NISL@THU
NISL@THU
L
LINUX DO - 热门话题
爱范儿
爱范儿
GbyAI
GbyAI
The Register - Security
The Register - Security
AWS News Blog
AWS News Blog
MyScale Blog
MyScale Blog
T
Tenable Blog
Hugging Face - Blog
Hugging Face - Blog
A
About on SuperTechFans
Cyberwarzone
Cyberwarzone
量子位
Microsoft Azure Blog
Microsoft Azure Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
博客园_首页
C
Cybersecurity and Infrastructure Security Agency CISA
The Cloudflare Blog
B
Blog RSS Feed
小众软件
小众软件
D
Docker
Know Your Adversary
Know Your Adversary
Y
Y Combinator Blog
P
Privacy & Cybersecurity Law Blog
Engineering at Meta
Engineering at Meta
Latest news
Latest news
AI
AI
SecWiki News
SecWiki News
酷 壳 – CoolShell
酷 壳 – CoolShell
S
Secure Thoughts
N
News | PayPal Newsroom
The Hacker News
The Hacker News
MongoDB | Blog
MongoDB | Blog
Martin Fowler
Martin Fowler
博客园 - 司徒正美
L
Lohrmann on Cybersecurity
Cloudbric
Cloudbric

博客园 - 磊

淘宝店铺开业送优惠券 报表统计查询 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