现在的位置: 首页 > 综合 > 正文

hibernate持久化对象

2017年12月27日 ⁄ 综合 ⁄ 共 1412字 ⁄ 字号 评论关闭

---Hibernate持久层:
数据源:负责维护数据库连接池,保证系统性能。
当程序创建数据源实例,系统会一次性先创建保存多个数据库连接,并负责分配空闲的数据库连接,避免频繁地获取和关闭数据库连接。

二级缓存:提高Hibernate持久化访问的性能(EHCache)

---hibernate持久化对象:
transient瞬时状态:new
persistent持久化状态:当前操作完成时Hibernate会自动将对象数据写回数据库,代码中不用显式执行update(get,load,save,persist)
detached托管状态:session关闭;若重新关联session则对象会变成持久态,且托管期间的改动不会丢失,也可被写入数据库。

瞬时态--->持久化态:
User user = new User();
user.setName("test");
user.setAge(20);
session.save(user);//该方法会将瞬时态的user持久化到数据库中(通过Hibernate session底层对应生成一条insert语句来实现)

持久化态对象--->修改:
user.setLastVisitTime(new Date());
session.flush();
//修改后无需调用update()方法也会在session flush之前由Hibernate自动保存修改内容到数据库!
//当调用持久化实体对象的setter方法后,在session flush之前Hibernate底层会自动生成一条update语句对数据进行持久化。

---save(),persist()方法的区别
http://blog.csdn.net/vking_wang/article/details/8960406
返回类型不同:save返回Serializable对象,而persist返回void
ID赋值时机不同:二者同样用于将transient实例持久化,但persist不保证ID值立即赋给持久化实例,可能会在flush的时候给ID赋值。
transaction外的行为不同:如果在transaction之外调用,persist保证会立即执行INSERT语句;而save则不保证(save返回一个identifier,如果必须执行INSERT来获取该identifier,则就会立即执行INSERT,而不论是在transaction之内或之外)
使用场景:由于上述第三点区别,persist方法适用于被扩展的Session上下文的长期运行的会话中(useful in long-running conversations with an extended Session context);而save则不适用。

---get(),load()方法的区别

http://blog.csdn.net/lenotang/article/details/2595349
如果未能发现符合条件的记录,get方法返回null,而load方法会抛出一个ObjectNotFoundException.
load是延迟加载,get是立即加载。
总之对于get和load的根本区别,一句话,hibernate对于load方法认为该数据在数据库中一定存在,可以放心的使用代理来延迟加载,如果在使用过程中发现了问题,只能抛异常;
而对于get方法,hibernate一定要获取到真实的数据,否则返回null。

抱歉!评论已关闭.