1. 持久化实体

为了让瞬态对象转换为持久化状态,HibernateSession提供了如下几个方法。

1)        Serialzable save(Object obj):将obj对象变为持久化状态,该对象的属性将被保存到数据库。

2)        void persist(Object obj):将obj对象转化为持久化状态,该对象的属性将被保存到数据库。

3)        Serializable save(Object obj,Object pk):将obj对象保存到数据库,保存到数据库时,指定主键值。

4)        void persist(Object obj,Objectpk):将对象转化为持久化状态,保存到数据库时,指定主键值。

为了将一个处于瞬态的对象变成持久状态,可以看如下的代码:

 // 创建消息对象News n = new News();// 设置消息标题和消息内容n.setTitle("my title");n.setContent("owen,"+ "网站地址http://www.owen.org");// 保存消息sess.save(n);

程序执行save()方法会立即将持久化对象对应的数据插入数据库;而persist()则保证当它在一个事务外部被调用时,并不立即转换成insert语句。这个功能是很有用的,尤其需要封装一个长会话流程的时候,persist()方法就显得尤为重要了。

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

程序可能通过load()来加载一个持久化实例,这种加载就是根据持久化类的标识属性值加载化实例——其实质就是根据主键从数据库中加载一条记录。

下面是直接加载持久化实体的代码:

News n = session.load(News.class, pk);

上面的代码中的pk就是需要加载的持久化实例标识属性。

当然,除了用load()的方法,我们也可以用get()的方法。load()方法和get()方法的主要区别在于是否延迟加载,使用load()方法将具有延迟加载功能,load()方法不会立即访问数据库,当试图加载的记录不存在时,load()方法可能返回一个未初始化的代理对象;而get()方法总是立即访问数据库,当试试图加载的记录不存在时,get()方法将直接返回null。

3. 更新持久化实体

程序对持久化实例实体所做的修改会在Sessionflush之前被自动保存到数据库,无须程序调用其它方法来将修改持久化。也就是说,修改对象最简单的方法就是Session处于打开状态load()它,然后直接修改即可。如果调用持久化实体的setter方法改变了实验室的属性,Hibernate会在Session flush之前生成一条update语句。

如下代码修改特定行的数据:

 News n = session.load(News.class, pk);n.setTitle(“新标题”);session.flush();

4. 更新脱管实体

对于一个曾经持久化过、但现在已脱离了Session管理的持久化对象,它被认为处于脱管状态。当程序修改脱管对象的状态后,程序应该是显式地使用Session来保存这些修改。Hibernate提供了update()、merge()和updateOrSave()等方法来保存这些修改。例如下面的代码:

News n = firstSession.load(News.class, pk);
//第一个Session已经关闭了
firstSession,close();
//修改脱管状态下的持久对象
n.setTilte(“新标题”);
//打开第二个session…
Session secondSession = ….
//保存脱管对象所做的修改
secondSession.update(n);

merge()方法也可将程序对脱管对象所做的修改保存到数据库,但merge()与update()方法的最大区别是:merge()方法不会持久化给定的对象。举例来说,当程序执行session.update(a)代码后,a对象将会变成持久化状态;而执行session.merge(a)代码后,a对象依然不是持久化状态,a对象依然不会被关联到Session上,merge()方法会返回a对象的副本——该副本处于持久化对象。

5. 删除持久化实体

还可以通过Session的delete()方法来删除该持久化实例,一旦删除了该持久化,该持久化实例对应的数据记录也将被删除。代码如下:

News n = session.load(News.class, ok);
session.delete(n);

6. Hibernate的“锁模式”

使用load()或get()方法加载持久化对象时,还可指定一个“锁模式“参数。Hibernate使用LockOptions对象代表”锁模式“,LockOptions提供了READ和UPGRADE两个静态属性来代表共享、修改锁。如下代码:

News n = Session.get(News.class, pk, LockOptions.UPGRADE);

Session.LockRequest的lock()方法也将某个脱管对象重新持久化,但该脱管对象也必须是没有修改过的!如下代码:

//简单地重新持久化
session.buildLockRequest(LockOptions.NONE).lock(news);
//先检查持久化对象的版本,然后重新持久化该对象
session.buildLockRequest(LockOptions.READ).lock(person);
//检查持久化对象的版本,然后使用SELECT…FOR UPDATE重新持久化对象
session.buildLockRequest(New LockOptions(LockMode.PESSIMISTIC_WRITE)).lock(teacher);

Hibernate的持久化对象状态的方法相关推荐

  1. 5 -- Hibernate的基本用法 --5 3 改变持久对象状态的方法

    1. 持久化实体 Serializable save(Object obj) : 将obj对象变为持久化状态,该对象的属性将被保存到数据库. void persist(Object obj) : 将o ...

  2. Hibernate持久化对象状态

    在Hibernate中,持久化对象再被操作过程中分为三个时期.这三个时期和session周期相关. 各自是瞬时(Transient),持久太(persistent)和游离态(Detached) 瞬时状 ...

  3. Hibernate→HQL、query.list()返回数据类型、查询相关语句、分页、原生SQL、@注解、持久化对象状态及生命周期、一多关系、继承映射关系、逆向工程

    HQL Query实例与表 session通用工具类 Query对象 from 类→List<类>接收 映射类 仅查询商品 查询商品及所在商家 别名 返回数据类型定义 Iterator接收 ...

  4. Hibernate开发和对象状态

    Hibernate开发和对象状态 Hibernate开发三种方式 1.由Domain object -> mapping->db.(官方推荐) 2.由DB开始,用工具生成mapping和D ...

  5. hibernate教程--持久化类状态详解

    一. Hibernate的持久化类状态: 1.1 Hibernate的持久化类状态 持久化类:就是一个实体类 与 数据库表建立了映射. Hibernate为了方便管理持久化类,将持久化类分成了三种状态 ...

  6. hibernate教程--持久化类状态

    一. Hibernate的持久化类状态: 1.1Hibernate的持久化类状态 持久化类:就是一个实体类 与 数据库表建立了映射. Hibernate为了方便管理持久化类,将持久化类分成了三种状态. ...

  7. hibernate中持久化对象的生命周期(三态:自由态,持久态,游离态 之间的转换)

    三态的基本概念: 1,  临时状态(Transient):也叫自由态,只存在于内存中,而在数据库中没有相应数据.用new创建的对象,它没有持久化,没有处于Session中,处于此状态的对象叫临时对象: ...

  8. hibernate中持久化对象的生命周期(三态:自由态,持久态,游离态 之间的转换)...

    三态的基本概念: 1,  暂时状态(Transient):也叫自由态,仅仅存在于内存中,而在数据库中没有对应数据.用new创建的对象,它没有持久化,没有处于Session中,处于此状态的对象叫暂时对象 ...

  9. Hibernate 几种对象状态

    Hibernate 中四种对象状态 临时状态(transient):刚用new 语句创建,还没有被持久化,并且不处于Sesssion 的缓存中.处于临时状态 的Java 对象被称为临时对象. 持久化状 ...

  10. hibernate中的PO持久化对象及PO三种状态

    一,认识持久化对象PO: 在hibernate的应用程序中,每一个数据库中的表都对应一个持久化对象PO.PO可以看成是与数据库表相映射的java对象.最简单的PO对应数据库中某个表中的一条记录,多个记 ...

最新文章

  1. 把博士男友的论文和资料全删了,然后……
  2. rust如何进枪战服_天龙八部怀旧服九大门派详细打造攻略——少林篇
  3. Michael Jordan获2020IEEE冯诺依曼奖,曾培养吴恩达、Bengio
  4. 概率论-1.2概率的定义及其确定方法
  5. VB.NET实现DirectPlay(3)Find HOSTs
  6. 系统即将关机请保存关机是由nt_设置Windows电脑自动关机
  7. YbtOJ#20239-[冲刺NOIP2020模拟赛Day10]连边方案【状压dp】
  8. drools 规则流_约束流–没有Drools规则语言的现代Java约束
  9. 配置 Docker 加速器
  10. 新增或编辑保存时出错后,页面无法再次编辑
  11. 单例模式访问mysql设计类图_如何应用策略设计模式分离JDBC数据库连接中的外部环境信息...
  12. session用户账号认证(一个用户登陆,踢出前一个用户)
  13. 认识XinYiCMS从这里开始!
  14. 帮助机器人自由行走 思岚科技推出激光导航模块
  15. Numpy中的向量运算
  16. chrome://dino/让恐龙无敌的代码
  17. java的默认访问权限_java类的访问权限
  18. ffmpeg 实现音频aac编码
  19. Android lunch分析以及产品分支构建
  20. java 数学测试_Java实现小学数学练习

热门文章

  1. HTMLCSS学习笔记(三)----标签类型转换、样式重置
  2. 5.7.2.4 random() 方法
  3. GPS时钟装置,北斗卫星授时,ntp校时服务器,网络时间服务器
  4. 丽江,是否一群失意的人聚合地
  5. 完美解决:Could not open the editor: Editor could not be initialized
  6. avc水平什么意思_5个步骤切实有效地提高你的写作水平
  7. C++网络编程实例(初识多线程)
  8. @RestController与@RequestMapping
  9. 分享一个非常不错的SSH工具
  10. 20155332 缓冲区溢出漏洞实验