Java @交易不';无法打开Hibernate事务

Java @交易不';无法打开Hibernate事务,java,spring,hibernate,transactions,Java,Spring,Hibernate,Transactions,我在my Beans.xml中声明了Spring bean: <context:annotation-config /> <context:component-scan base-package="com.pack"/> <tx:annotation-driven transaction-manager="transactionManager" /> <bean id="transactionManager" class

我在my Beans.xml中声明了Spring bean:

<context:annotation-config />   
<context:component-scan base-package="com.pack"/>
<tx:annotation-driven transaction-manager="transactionManager" />
<bean id="transactionManager"
              class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
     <property name="sessionFactory" ref="sessionFactory"/>
     <property name="dataSource" ref="dataSource"></property>
</bean>
如果我分别使用sessionFactory和DataSourceBean,它们工作得很好。A也有DAO类:

@Repository(value = "itemDaoHibernateImpl")
public class ItemDaoHibernateImpl implements ItemDao {

    @Resource(name = "sessionFactory")
    private SessionFactory factory;

    public void setFactory(SessionFactory factory) {
        this.factory = factory;
    }

    public Session session() {
        return factory.getCurrentSession();
    }

    @Override
    public void create(Item item) {
        session().save(item);
    }
我不打开会话,因为我想强制Spring这样做。我有服务类和方法:

@Override
@Transactional
public void create(Item item) {
    dao.create(item);
}
当我调用它时,我有一个例外:

org.hibernate.hibernate异常:如果没有活动事务,则保存无效


我做得很好。我的错误在哪里?

当我遇到这个问题之前,它是因为Spring是使用CGLib还是Javassist来扩展类以提供事务性。如果我没记错的话,如果您只有Javassist,那么Spring需要在其上创建代理以实现事务注释的类必须实现一个接口。

尝试从您的sessionFactory配置中删除
props.put(“hibernate.current_session_context_class”,“thread”)
。当您使用Spring管理的事务时,您不需要它。让我知道这是否有效。

是否注入调用
create(Item)
的类?(我提高了投票率,这样你就有足够的声誉在评论中回答问题)你能为
sessionFactory
提供你的实现吗?当然可以。我已经更新了我的问题。看看我的数据源和sessionFactorybeans@Transactional是使用SpringAOP应用的(默认情况下使用JDK代理),您的服务是否实现了接口?对create的调用是否在声明create方法的服务类的外部?谢谢!!明亮的它起作用了!但是,如果我不确定该参数,spring将如何创建新会话?spring将如何根据每个请求创建新会话?我应该怎么做?SessionFactory是由Spring使用给定的数据源创建的,它从连接池中获取其DB连接。我们通过SessionFactory.getCurrentSession()获得Hibernate会话。然后启动事务,完成工作,然后提交()或回滚(),最后关闭连接(连接对象将返回到池)。当我们停止应用程序或关闭服务器时,Hibernate会话工厂将被销毁/关闭。我应该在这个参数中输入什么值?不要为Spring管理的事务设置任何值,使用@Transactional.Spring从Hibernate获得的
CurrentSessionContext
接口的@Transactional.Spring。这是默认设置的,只要您开始处理
current\u session\u context\u class
属性,就不会出现这种情况,因此使用Spring时的一般经验法则是不要设置该属性。
@Override
@Transactional
public void create(Item item) {
    dao.create(item);
}