1

我正在使用带有 Atomikos 和 Spring 3.1 的 Hibernate 3.6.9。看完@Transactional注解属于哪里?我已经从所有 DAO 中删除了 @Transactional 注释,并且只将它们留在了 Service 中。在我收到的任何 dao db 操作上删除这些注释后

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>

我应该如何管理 DAO 的事务,以及如何在 Service 之外使用 DAO?解决此问题的唯一方法是在使用 daos 的任何层中手动启动事务(具有传播需要新的事务)?但是,在将事务与 DAO 一起使用时,我遇到了延迟初始化异常的问题(事务在表示层之前关闭 - 尝试初始化实体字段)。

编辑:

当spring mvc的控制器可以直接访问DAO时我应该如何管理事务?控制器应该是事务性的吗?

我的问题在登录过程中也出现了,因为spring security使用dao(没有@Transactional)所以没有层启动事务?

将@Transactional 添加到spring security 使用的例如daos 可以解决问题-> 当有@Transactional 时一切正常,但是如果没有此注释,则无法使用db。但是给一些DAO加上@Transactional会带来问题,因为spring mvc要显示一些数据的时候会出现延迟初始化异常,然后dao中只有手动Hibernate.initialize起作用(因为最后@Transactional在表现层之前关闭事务!)。

4

2 回答 2

1

IMO,您应该初始化 DAO 中稍后在表示层中需要的对象的那些字段。

如果急切地初始化这些对象对您来说有点“脏”,您应该引入新的表示层特定类(视图模型),这些类由您的服务层映射(如果需要,它仍然有一个开放的事务可以读取)。

由于本人没有Java背景,不知道“spring security”是否需要访问数据库。如果是这样,您还必须在相应的服务层上添加这些事务属性,正如您已经发现的那样。但是,我认为您不一定应该将事务属性放在 DAO 方法周围,这通常是一个更深的层次。

于 2011-12-31T14:26:37.813 回答
0

不,错误是告诉您配置 JTA 事务管理器:

http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/transaction/jta/JtaTransactionManager.html

选择最适合您的情况的一种。

这个 Hibernate 论坛问题也可能是相关的:

https://forum.hibernate.org/viewtopic.php?p=2430788

控制器不应该事务性的。您将它们放在正确的位置-它们属于服务。

OpenSessionInView 可能是您的解决方案:

http://springtips.blogspot.com/2007/07/open-session-in-view.html

或者它可能不会:

为什么 Hibernate Open Session in View 被认为是一种不好的做法?

于 2011-12-31T13:18:53.580 回答