持久化对象三种状态之间的转换

本文总结了Hibernate中持久化对象的三种状态:瞬态、持久化和脱管,详细介绍了各状态间的转换,如save()与persist()的区别,load与get的加载方式,以及如何通过update()、merge()、updateOrSave()将脱管对象恢复为持久化状态。此外,还探讨了merge()与save()的不同之处。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.Hibernate持久化对象的三种状态总结:

    1.瞬态:使用new刚创建的并且还未与Hibernate Session关联的对象此时处于瞬态。瞬态对象还不会与数据库之间进行关联

    2.持久化:持久化实例在数据库中有对应的记录,持久化实例可以是刚保存的,也可以是刚被加载的

    3.脱管:曾经处于持久化状态,随着关联的Session被关闭之后,该对象就变成了脱管状态

2.瞬态->持久化状态

    Serializable save(Object obj):将obj对象变为持久化状态,该对象的属性将被保存到数据库
    void perssist(Object obj):作用同上
    Serializable save(Object obj,Object pk):将obj对象变成持久化状态,保存到数据库时,指定主键值
    void perssist(Object obj,Object ph):作用同上

上面的指定主键值的方法用于持久化对象的标识属性类型为assigned类型属性或为复合属性,这就需要手动设置主键值
save()方法和perssist()的区别在于:save()返回该持久化对象的标识属性值,也就是对应记录的主键值;而perssist()没有任何返回值;这样一来save方法就需要立即返回持久化对象的标识属性值,所以执行save方法会立即将持久化对象对应的数据插入到数据库,而perssist方法则不会被立即转换成insert语句

3.根据主键加载持久化实体

    1.load():News n = session.load(News.class,pk);
    2.get():News n = session.get(News.class,pk);

两个方法的区别在于:load具有延迟加载功能,不会立即访问数据库,而是先返回一个未初始化的代理对象,只有当程序调用该代理对象的某个方法时,Hibernate才会去访问数据库;而get总是立即访问数据库。当试图加载的记录不存在时,load会返回一个未初始化的代理对象,而get直接返回null

4.更新持久化实体

    session.flush();//生成一条Update语句,where pk=pkvalue
    //如下实例:
        News n = session.load(News.class,pk1) ;
        n.setTitle("easy hibernate code") ;
        session.flush() ;

5.脱管->持久化状态
之前说持久化状态关联对应的session被关闭之后,持久化对象就处于了脱管状态,Hibernate提供了update()、merge()、updateOrSave()来将其重新变成持久化状态,主要用于保存修改。如下

    News n = fsession.load(News.class,id) ;
    fsession.close() ;
    n.setTitle("easy hibernate code") ;
    Session Ssession = ...
    Ssession.update(n) ;

update():保存程序对持久化对象所做的修改
updateOrSave():如果曾经持久化过,则update,否则save
merge():保存程序对持久化对象所做的修改
merge()和save()方法区别在于:merge()不会持久化给定的对象,如:merge(a);a不会变成持久化状态,只是a修改的操作会被保存而已,a仍然处于脱管状态,因为merge返回值为a对象的副本,该副本处于持久化装填,也就是说merge返回值为与a同类型的类型;而save()返回值为void,会保存修改,也会是a变成持久化状态

6.删除持久化实体

News n = session.load(News.class,pk) ;
//该持久化实例对应的数据记录将从数据库表中删除
session.delete(n) ;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值