Hibernate DAO'中的事务使用;s
我将Hibernate3.6.9与Atomikos和Spring3.1一起使用。阅读之后,我从所有DAO中删除了@Transactional注释,并且只将它们保留在服务上。在删除我收到的任何dao db操作上的注释之后Hibernate DAO'中的事务使用;s,hibernate,spring,transactions,jta,atomikos,Hibernate,Spring,Transactions,Jta,Atomikos,我将Hibernate3.6.9与Atomikos和Spring3.1一起使用。阅读之后,我从所有DAO中删除了@Transactional注释,并且只将它们保留在服务上。在删除我收到的任何dao db操作上的注释之后 org.hibernate.HibernateException: Unable to locate current JTA transaction 我的配置: <tx:annotation-driven transaction-manager="jtaTrans
org.hibernate.HibernateException: Unable to locate current JTA transaction
我的配置:
<tx:annotation-driven transaction-manager="jtaTransactionManager" />
<!-- Configure the Spring framework to use JTA transactions from Atomikos -->
<bean id="jtaTransactionManager"
class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="transactionManager" ref="atomikosTransactionManager" />
<property name="userTransaction" ref="atomikosUserTransaction" />
</bean>
<!-- Construct Atomikos UserTransactionManager, needed to configure Spring -->
<bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager"
init-method="init" destroy-method="close">
<!-- when close is called, should we force transactions to terminate or
not? -->
<property name="forceShutdown" value="false" />
</bean>
<!-- Also use Atomikos UserTransactionImp, needed to configure Spring -->
<bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp">
<property name="transactionTimeout" value="300" />
</bean>
会话工厂属性:
<prop key="hibernate.connection.isolation">3</prop>
<prop key="hibernate.current_session_context_class">jta</prop>
<prop key="hibernate.transaction.factory_class">com.atomikos.icatch.jta.hibernate3.AtomikosJTATransactionFactory
</prop>
<prop key="hibernate.transaction.manager_lookup_class">com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup
</prop>
3
jta
com.atomikos.icatch.jta.hibernate3.AtomikosJTATransactionFactory
com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup
我应该如何管理DAO的事务,以及如何在服务外部使用DAO?解决这个问题的唯一方法是在任何使用DAO的层中手动启动事务(具有传播的事务需要新的)?然而,当使用事务DAO时,我遇到了延迟初始化异常的问题(事务在表示层之前关闭-尝试初始化实体字段)
编辑:
当spring mvc的控制器可以直接访问DAO时,我应该如何管理事务?控制器应该是事务性的吗
我的问题也出现在登录过程中,因为spring security使用dao(不带@Transactional),所以没有层启动事务
将@Transactional添加到例如spring security使用的DAO可以解决问题->当存在@Transactional时,一切都可以工作,但如果没有此注释,则不可能使用db。但将@Transactional添加到某些dao会带来问题,因为当spring mvc想要显示某些数据时,会出现延迟初始化异常,然后dao中只有手动Hibernate.initialize起作用(因为最后一个@Transactional在表示层之前关闭事务!)。否,错误提示您配置JTA事务管理器: 选择一个最适合你的情况 Hibernate论坛的这个问题也可能是相关的: 控制器不应是事务性的。你把它们放在了正确的地方——它们属于服务业 OpenSessionInView可能是您的解决方案: 也可能不是:
否,错误提示您配置JTA事务管理器: 选择一个最适合你的情况 Hibernate论坛的这个问题也可能是相关的: 控制器不应是事务性的。你把它们放在了正确的地方——它们属于服务业 OpenSessionInView可能是您的解决方案: 也可能不是:
在我看来,您应该初始化DAO中的对象字段,这些字段稍后在表示层中需要 如果急切地初始化这些对象让您感觉有些“脏”,那么您应该引入新的表示层特定类(viewmodel),这些类由您的服务层映射到(如果需要,它仍然有一个打开的事务可供读取)
由于我没有Java背景,我不知道“SpringSecurity”是否需要访问数据库。如果是这样,您也必须在相应的servicelayer上添加这些事务属性,正如您已经发现的那样。然而,我不认为您必须在DAO方法周围放置事务属性,这通常是一个层次到深度 IMO,您应该初始化dao中的对象字段,这些字段稍后在表示层中需要 如果急切地初始化这些对象让您感觉有些“脏”,那么您应该引入新的表示层特定类(viewmodel),这些类由您的服务层映射到(如果需要,它仍然有一个打开的事务可供读取)
由于我没有Java背景,我不知道“SpringSecurity”是否需要访问数据库。如果是这样,您也必须在相应的servicelayer上添加这些事务属性,正如您已经发现的那样。然而,我不认为您必须在DAO方法周围放置事务属性,这通常是一个层次到深度 我想问题是您的服务上的@Transaction注释没有被考虑在内。-请发布其中一种带有交易注释的服务方法,以及带有调用该方法的语句的方法和启用事务性批注支持的配置部分。@Ralph我已经扩展了我的问题。我想问题是没有考虑到您服务上的@Transaction批注。-请发布其中一种带有交易注释的服务方法,以及带有调用该方法的语句的方法和启用事务注释支持的配置部分。@Ralph我扩展了我的问题。我已经按照atomikos文档中的描述配置了JTA事务管理器。类签名是否符合Spring的JTA?如果没有,将如何使用?对不起,我不熟悉Atomikos。查看Hibernate论坛的问题。它讨论了会话问题。我已经按照atomikos文档中的描述配置了JTA事务管理器。类签名是否符合Spring的JTA?如果没有,将如何使用?对不起,我不熟悉Atomikos。查看Hibernate论坛的问题。它讨论了会话问题。通过在dao中初始化此字段来解决lazili初始化异常还有另一个缺点-我们仍在处理分离的对象。我正在使用OpenSessionInViewFilter将会话范围扩展到表示层。您不应尝试捕获异常,但应确保从服务层传回表示层的对象包含所有需要的值(因此已初始化)。通过初始化此字段来解析lazili初始化异常在dao中还有另一个缺点——我们仍在努力