您的位置:首页 > 其它

Hibernate学习笔记 之 持久化对象的状态

2016-11-16 19:41 330 查看


瞬态、持久态、脱管 概念见:http://blog.csdn.net/fanfan4569/article/details/53054683

一、持久化实体

save() 方法 与 persist()



  注:save() 带返回值



  注:persist() 不带返回值

区别:

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

二、根据主键加载持久化实体

load() 与 get()

User user = session.get(User.class, "4028dc8158432b8a0158432b8c240000");
User user = session.load(User.class, "4028dc8158432b8a0158432b8c240000");




  如果没有匹配的数据库记录,load()方法可能抛出HibernateException()异常;如果在持久化注释中指定了延迟加载,则load()方法会返回一个未初始化的代理对象(可以理解为持久化对象的替身),这个代理对象并没有加载数据记录,知道程序调用该代理对象的某方法时,Hibernate才会去访问数据库。(如果希望在某对象中创建一个指向另一个对象的关联,又不想从数据库中装载该对象的同时立即装载所关联的对象,延迟加载方式就很有用。)



  get()方法会立刻访问数据库,如果没有对应的记录,get()方法返回null,而不是返回一个代理对象。

二、更新持久化实体



User user = session.load("User.class", "4028dc8158432b8a0158432b8c240000");
user.setAddress("中国");
session.flush();


  这上面相当于一条查询指定记录的select语句,另一条用于修改该记录的update语句。

  Hibernate通常的处理流程是:从数据库里加载记录—>将信息范松到表现层供用户修改—->将所做修改重新保存到数据库。需要2条SQL语句。

三、更新脱管实体

User user = firtstSession.load("User.class", "4028dc8158432b8a0158432b8c240000");
user.setAddress("中国");
Session secondSession = ...
//保存脱管对象所做的修改
secondSession.update(user);


  如果不清楚该对象是否曾经持久化过,可以选择使用updateOrSave()



  merge()方法也可将程序对脱管对象所做的修改保存到数据库。区别在于session.update(user),user对象会变成持久化状态;而执行session.merge(user),user对象依然不是持久化状态,user对象依然不会被关联到Session上,merge()方法会返回user对象的副本——-该副本处于持久化状态。

//使用load()或get()方法加载持久化对象时,还可指定一个“锁模式”
//LockOptions对象代表“所模式”,LockOptions提供READ和UPGRADE两个静态属性来代表共享、修改锁
User user = Session.get(User.class, pk, LockOptions.UPGRADE);


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

四、删除持久化实体

User user = session.load("User.class", "4028dc8158432b8a0158432b8c240000");
session.delete(user);


  一旦删除了该持久化实例,该持久化实例对应的数据记录也将被删除;

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hibernate