在使用JTA事务管理器时,我在迁移到休眠4时遇到了一些麻烦 也许你可以提供帮助,因为我完全没有想法。
软件:
Spring: 3.1.1.RELEASE
Hibernate: 4.1.3.Final
数据库: Oracle 11g
应用程序: Ejb 3.0 部署在 Websphere Application Server 7.0 中(使用@Interceptors(SpringBeanAutowiringInterceptor.class)
初始化弹簧上下文)
春季配置:
<context:annotation-config />
<context:component-scan base-package="myServicePackage,myDaoPackage" />
<jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/MyDataSource" />
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="packagesToScan" value="myModelPackage" />
<property name="mappingResources" value="queries.xml" />
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
</props>
</property>
</bean>
<tx:jta-transaction-manager />
<!-- <bean id="transactionManager" class="org.springframework.transaction.jta.WebSphereUowTransactionManager" /> -->
<tx:annotation-driven />
服务
@Service
public class TradeService {
@Autowired
private TradeDao tradeDao;
}
道:
@Repository
@Transactional
public class TradeDao {
@Autowired
private SessionFactory sessionFactory;
public Trade getTrade(){
return (Trade) sessionFactory.getCurrentSession().getNamedQuery("get_trade").uniqueResult();
}
抛出:
org.hibernate.HibernateException: No Session found for current thread
at org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:97)
at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:1041)
at myDaoPackage.TradeDao.getTrade(TradeDao.java:26)
注意:
@Transactional
而不是
道。结果相同。HibernateDaoSupport
的TradeDao。那么,有没有人有任何想法? 我今天一整天都在尝试很多事情 我的头在旋转,我很生气,所以我一定很想念一些非常简单的东西,但在这一点上我真的不能说:)
答案 0 :(得分:1)
我终于有了这个工作。
正如我所料,我只缺少一些小配置:)
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
<prop key="hibernate.transaction.factory_class">org.hibernate.transaction.CMTTransactionFactory</prop>
<prop key="hibernate.transaction.manager_lookup_class">org.hibernate.transaction.WebSphereExtendedJTATransactionLookup</prop>
</props>
</property>
我在浏览时更早地找到了这些配置选项,但由于某种原因,我在尝试它们时无法正常工作。当时我可能还有其他错误......(见Transaction strategy configuration章节)
谢谢大家的帮助!
答案 1 :(得分:0)
这可能与此人遇到的问题非常相似:http://forum.springsource.org/showthread.php?121109-Transaction-Propagations-and-Hibernate-4
也就是说,如果在线程上找不到一个会话,HibernateDaoSupport(以及可能是HibernateTemplate)正在创建一个Session,而听起来好像新方法没有。
编辑:我刚刚意识到包含的链接正在使用HibernateTransactionManager。我相信如果你使用JtaTransactionManager并且不使用HibernateTemplate,你必须在创建会话的目标周围手动应用建议。它可能也是他们在春天错过的东西:https://jira.springsource.org/browse/SPR-9404
答案 2 :(得分:0)
默认情况下,@ Transactal注释适用于接口。由于你没有接口,你应该将proxy-target-class =“true”属性添加到&lt; tx:annotation-driven /&gt;在您的配置中标记。