我是Hibernate的新手,对事务划分有一些问题(我已经在Stack Overflow,Hibernate文档中搜索过了,但还没有找到答案)。
- 首先,我使用Maven Hibernate Tools插件生成Hibernate Beans和DAOS
- 在生成过程之后,我将我的数据库访问jar包含到我的Java项目中
简单查询可以正常工作,但当我使用多个联接执行复杂查询时,集合不会被提取(延迟提取),并且当我尝试调用相应的时
get方法来检索数据,我得到了一个惰性初始化异常,因为我的会话上下文是:thread,并且会话已通过事务提交关闭。
我需要会话的寿命更长,以便显式地使用get方法。
我的hibernate cfg是:
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>
<property name="current_session_context_class">thread</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306 /mydatabase</property>
<property name="hibernate.connection.username">user</property>
<property name="hibernate.connection.password">1234</property>
<property name="hibernate.format_sql">true</property>
<property name="hibernate.use_sql_comments">true</property>
</session-factory>
在这种情况下,是否有必要使用JTA事务(我不使用Web服务器),或者是否有可能在不显式初始化懒惰集合的情况下实现不附加到事务范围(JDBC)的更长会话?
我修改了hibernate工具的代码模板(ftl文件)来生成自定义的DAO和Beans。
使用Maven Hibernate Tools插件,我生成了数据库访问层。
在HibenateBeans中添加一个方法,将一个分离的对象重新附加到一个新的Hibernate会话中,这是否合理?类似于:
s.getCurrentSession().beginTransaction();
r.lock(p,LockMode.NONE);
一旦getter方法检索到数据,就会提交事务并关闭会话。使用此策略,我认为可以避免延迟初始化问题。
虽然我不确定在多线程或多进程的情况下是否会有任何问题。
谢谢。