您的位置:首页 > 其它

Hibernate_Session核心方法

2017-06-04 21:52 274 查看
我认为Hibernate和MyBatis有本质的不同,可以说Hibernate更加对象化。开发者在使用这个框架的时候,为实体类配置好了对应的关系映射,接下来的工作就是操作对象了,无论是CRUD的哪一种操作都转换为了Hibernate_Session的核心方法。而且每一种操作都可能不只一种方法。了解这些核心方法对开发者是绝对必要的,这样就可以在开发中把更多的时间放在逻辑实现上,而不是没完没了的调试那些完全可以避免的bug。

1、Session 的 save()和persist() 方法

此方法是一个临时对象转换为持久化对象。可以将新建的对象(临时对象)加入到持久化对象中,转为持久化状态。当然需要生成一个对象标识符(OID),这个OID的生成策略是核心配置文件的主键映射标签<id>来规定的。

如果配置中指定了使用代理主键的生成方式(除了assigned的自然主键生成方式,其他都是代理主键的生成方式),那么使用setId()方法来设置OID是无效的。

计划执行一条insert语句:在flush缓存的时候。

注意:OID是持久化对象用来维持和数据库相关记录的对应关系,所以不允许程序随意修改它的ID。

persist() 和 save() 区别:

当对一个 OID 不为 Null 的对象执行 save() 方法时, 会把该对象以一个新的 oid 保存到数据库中;  但执行 persist() 方法时会抛出一个异常

2、Session 的 get() 和 load() 方法

当数据库中不存在与 OID 对应的记录时, load() 方法抛出 ObjectNotFoundException 异常, 而 get() 方法返回 null

两者采用不同的延迟检索策略:load 方法支持延迟加载策略。而 get 不支持。

延迟加载的问题是:因为load是需要某个对象的时候才去加载,所以如果中途Session连接关闭了,那么load方法就会抛出一个LazyInitializationException异常,get方法则不会。

所以总结起来,load方法的好处就是可以提高系统的执行效率,但是却让系统失去了稳定性。

3、Session 的 saveOrUpdate() 方法

Session 的 saveOrUpdate() 方法同时包含了 save() 与 update() 方法的功能。Hibernate通过判断对象是游离对象还是临时对象来确定使用update方法或者save方法。判断的标准是Java对象的OID是否为null,为null就是临时对象。或者更加显式的指定判断方法:在映射文件中为 <id> 设置了 unsaved-value  属性, 并且 Java 对象的 OID 取值与这个 unsaved-value
属性值匹配则我临时对象。

4、Session 的 update() 方法

Session 的 update() 方法使一个游离对象转变为持久化对象, 并且计划执行一条 update 语句.

若希望 Session 仅当修改了 News 对象的属性时, 才执行 update() 语句, 可以把映射文件中 <class> 元素的 select-before-update 设为 true. 该属性的默认值为 false

当 update() 方法关联一个游离对象时, 如果在 Session 的缓存中已经存在相同 OID 的持久化对象, 会抛出异常

当 update() 方法关联一个游离对象时, 如果在数据库中不存在相应的记录, 也会抛出异常. 

5、Session 的 merge() 方法

loading.....

6、Session 的 delete() 方法

Session 的 delete() 方法既可以删除一个游离对象, 也可以删除一个持久化对象

Session 的 delete() 方法处理过程

计划执行一条 delete 语句

把对象从 Session 缓存中删除, 该对象进入删除状态.

Hibernate 的 cfg.xml 配置文件中有一个 hibernate.use_identifier_rollback 属性, 其默认值为 false, 若把它设为 true, 将改变 delete() 方法的运行行为: delete() 方法会把持久化对象或游离对象的 OID 设置为 null, 使它们变为临时对象,而不是转为删除状态。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐