【问题标题】:Hibernate Transaction Demarcation in a non Web application非 Web 应用程序中的 Hibernate 事务划分
【发布时间】:2013-01-20 12:07:28
【问题描述】:

我是 Hibernate 的新手,我有一些关于事务分界的问题(我已经在 Stack Overflow、Hibernate 文档中进行了搜索……但我没有找到答案)。

  • 首先,我使用 Maven Hibernate 工具插件生成 Hibernate Bean 和 DAOS。
  • 在生成过程之后,我将数据库访问 jar 包含到我的 Java 项目中。

简单查询可以正常工作,但是当我执行具有多个连接的复杂查询时,不会获取集合(延迟获取)并且当我尝试调用相应的时

获取数据的方法,我得到一个惰性初始化异常,因为我的会话上下文是:线程并且会话已通过事务提交关闭。

我需要会话更长的时间才能显式地获取集合 一个 get 方法。

我的休眠配置是:

<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) 的更长会话?

【问题讨论】:

  • 鉴于您两次回答了自己的问题,您应该阅读 Stackoverflow 常见问题解答:stackoverflow.com/faq

标签: hibernate jdbc transactions


【解决方案1】:

我已修改休眠工具代码模板(ftl 文件)以生成自定义 DAO 和 Bean。

使用 Maven Hibernate 工具插件,我生成了我的数据库访问层。

向 Hibenate Beans 添加一个将分离的对象重新附加到新的 Hibernate 会话的方法是否合理?类似:

s.getCurrentSession().beginTransaction();

r.lock(p, LockMode.NONE);

一旦通过 getter 方法检索到数据,事务就会被提交并且会话将被关闭。使用这种策略,我认为可以避免延迟初始化问题。

虽然我不确定在多线程或多进程情况下是否会出现任何问题。

谢谢。

【讨论】:

    猜你喜欢
    • 2014-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-19
    • 2014-04-21
    • 1970-01-01
    相关资源
    最近更新 更多