`

Hibernate的lazy问题

阅读更多
no session or session was closed
1、 关闭延迟加载特性。

因为hibernate的延迟加载特性是在hbm配置里面可控制的。默认lazy="true",我们需要将其设置为”false”.

Annotation方式:

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)

配置文件方式:

<class name="User">

<id name="id">

<generator class="native"/>

</id>

<property name="name" not-null="true" length="50"/>

<property name="age" not-null="true" length="200" lazy="false"/>

</class>

2、 在session关闭之前把我们想要查询的数据先获取了。

--------------------------------------------------------------------------------------------------------

首先说明一下,hibernate的延迟加载特性(lazy)。所谓的延迟加载就是当真正需要查询数据时才执行数据加载操作。因为hibernate当中支持实体对象,外键会与实体对象关联起来。如果没有这一特性,当查询某一个含有外键的实体对象时,hibernate会把其他实体对象的数据都查询出来。

简单的来说,当你想查询某个对象时,实际上调用了多条查询语句。有了延迟加载特性,就避免了这种情况的发生,当你真正的使用get另外一个实体对象时, 才再执行下面一条查询语句。

但有些时候,这个特性却会给我们应用中带来一些问题。

这个问题相信大家并不陌生了,hibernate的延迟加载(lazy)特性的确不错的优点,如果没了这个特性,我相信大家在处理一些外键的对象时会头大起来,因为效率十分的低。甚至很多人都觉得使用jdbc要比hibernate要高效甚至方便得多,而迫使不去使用hibernate。

我想说,没错,使用jdbc在效率上的确可能要快许多,但差距也不会太大的,因为hibernate本身就支持多种查询方式,SQL、HQL、DetachedCriteria等。而相反的,hibernate在维护性上比jdbc强很多,因为是实体对象的关系。我相信如果您使用过jdbc来实现注册功能的话,会深有体会。

提示session已关闭(no session or session was closed)

触发这个问题的原因在于,hibernate在查询操作完毕的时候会自动的把session关闭掉,为了降低使用的资源。但问题也这样产生了,不要忘了之前所说的hibernate特性,此时再调用get实体方法的时候就会有可能出现这个错误。因为session已经关闭而不能继续执行查询了。
0
1
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics