我在我的应用程序中使用 spring + hibernate + jersey。我想使用事务,所以我在我的服务层中使用了 spring 的 @Transactional 注释。这是我的 hibernate.cfg.xml:
<hibernate-configuration>
<session-factory>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/db</property>
<property name="hibernate.connection.username">user</property>
</session-factory>
</hibernate-configuration>
我在这里没有使用 session_context ,所以 spring 可以管理它。在我的 applicationCONtext.xml 中,我定义了 transactionManager:
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/db"/>
<property name="user" value="username"/>
</bean>
<context:annotation-config/>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation">
<value>classpath:hibernate.cfg.xml</value>
</property>
<property name="packagesToScan">
<list>
<value>com.hibernate.pojos</value>
</list>
</property>
</bean>
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
所有匹配 /api/v1/* 的 url 都映射到名为 jersey 的 servlet 和使用的 servlet 类com.sun.jersey.spi.spring.container.servlet.SpringServlet
,我已将 com.services 作为要扫描的包传递给该类。在这个包中,我有一个类:
@Path("/app")
@Component
public class testApi() {
@Autowired
private DAOImpl daoimpl;
@POST
@Path("/create")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
@Transactional(rollbackFor = {Exception.class})
public Map<String,Object> testHello(user u) {
Map response = daoimpl.save(u);
return response;
}
}
该类daoimpl
具有自动装配的 sessionFactory 并使用sessionFactory.getCurrentSession()
方法来获取会话。该方法daoimpl.save(obj)
只是将其保存在数据库中。由于我已将 testHello 标记为事务性,我希望一个由 spring 管理的事务开始,然后控制权应该转到实际保存发生的 daoimpl。但是如果没有活动的交易,我得到的保存是无效的。我看过很多帖子,其中在休眠配置中提到了 session_context,因此,spring 无法处理事务。但就我而言,我确保我不提供任何 session_context。我错过了什么?我什至尝试将@transactional 添加到 DAO,因为在我的示例应用程序中,我只是为服务发出一个数据库调用。但这也不起作用。