Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用HIbernate with Spring';s@Transactional注释_Java_Hibernate_Spring_Transactions - Fatal编程技术网

Java 使用HIbernate with Spring';s@Transactional注释

Java 使用HIbernate with Spring';s@Transactional注释,java,hibernate,spring,transactions,Java,Hibernate,Spring,Transactions,我目前正在编写一个应用程序,它将使用Spring和Hibernate。在我的服务层中,我注入了一个DAO,它将执行一些非常基本的CRUD操作。对于GRIN,我创建了一个方法,注释如下: @Transactional(readOnly = false, propogation=Propogation.REQUIRES_NEW) public void doSomeWork(Dao dao, Entity e){ //do some searching dao.persist(e);

我目前正在编写一个应用程序,它将使用Spring和Hibernate。在我的服务层中,我注入了一个DAO,它将执行一些非常基本的CRUD操作。对于GRIN,我创建了一个方法,注释如下:

@Transactional(readOnly = false, propogation=Propogation.REQUIRES_NEW)
public void doSomeWork(Dao dao, Entity e){
    //do some searching
    dao.persist(e);
    dao.findAll(Entity.clz);
}
dao persist方法如下所示:

public void persist(Entity e){
     session.saveOrUpdate(e); //This has already been built using a SessionFactory
}
dao findAll方法如下所示

public void findAll(Class clz) {
     session.createCriteria(clz).list();
}
现在,一切似乎都在运行,好吗。插入(持久化)对象后,我可以使用findAll方法查看它(以及数据存储分配给它的新主键ID),但是,当“doSomeWork”方法完成时,我的数据实际上不会持久化到底层数据存储(Oracle 10g)

但是,如果我删除@Transactional注释并使用Hibernate的session.getTransaction().begin()和session.getTransaction().commit()(或rollback),那么代码将按照我的预期工作

因此,我的潜在问题是:Hibernate是否实际使用Spring的事务管理进行实际事务管理

在我的bean配置文件中,我声明了一个TransactionManager bean,一个SessionFactorybean,我还包括在配置文件中


除了更好地了解Spring和Hibernate之外,我可能还缺少什么?

您使用什么方法从会话工厂获取会话对象?您使用的是
openSession()
,还是
getCurrentSession()
,或者其他什么?这很重要,因为您需要将会话绑定到spring事务(我怀疑
openSession
是否适合您的场景)


我建议您使用Spring的hibernateTemplate来调用saveOrUpdate并持久化,而不是使用session对象。通过这种方式,您可以保证它将绑定到事务,并且,正如spring承诺的那样,如果您更改了事务管理策略,您将不需要更改代码。

您使用什么方法从会话工厂获取会话对象?您使用的是
openSession()
,还是
getCurrentSession()
,或者其他什么?这很重要,因为您需要将会话绑定到spring事务(我怀疑
openSession
是否适合您的场景)


我建议您使用Spring的hibernateTemplate来调用saveOrUpdate并持久化,而不是使用session对象。通过这种方式,您可以保证它将绑定到事务,并且,正如spring所承诺的,如果您更改了事务管理策略,您就不需要更改代码。

听起来spring实际上没有注入事务处理代码。 您的配置文件中是否有类似的内容,告诉spring在哪里查找带注释的类

<beans xmlns:context="http://www.springframework.org/schema/context" ...
    xsi:schemaLocation="http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-3.0.xsd ..." >

    ...
    <context:annotation-config/>
    <context:component-scan base-package="mypackage.dao.impl"/>

    <bean name="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>

</beans>

...

听起来spring实际上并没有注入事务处理代码。 您的配置文件中是否有类似的内容,告诉spring在哪里查找带注释的类

<beans xmlns:context="http://www.springframework.org/schema/context" ...
    xsi:schemaLocation="http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-3.0.xsd ..." >

    ...
    <context:annotation-config/>
    <context:component-scan base-package="mypackage.dao.impl"/>

    <bean name="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>

</beans>

...

不要忘记为
@Transactional
支持添加
不要忘记为
@Transactional
支持添加
好的,好的,感谢所有响应的人。。。它帮助我找出我做错了什么

在我过于热心的“概念证明”中,我从未真正意识到到底发生了什么,直到我意识到我的“带有一个主方法的简单java类将完成我所有的工作”不是由spring管理的,因此没有真正的事务管理。这绝不会像产品应用程序那样,由带有控制器bean、服务等的应用程序服务器进行管理

然后我明白了。。。“服务”。。。我将有一个服务层,这是事务支持的所在。所以,就像rain一样,我创建了一个简单的服务bean(用@Transactional标记),它的工作方式和我希望的一样。所以,我在我的服务上调用方法,它在我的Dao和bam上调用方法!!!它起作用了


再次感谢所有帮助我得出这一结论的人。

好的,好的,感谢所有回应的人。。。它帮助我找出我做错了什么

在我过于热心的“概念证明”中,我从未真正意识到到底发生了什么,直到我意识到我的“带有一个主方法的简单java类将完成我所有的工作”不是由spring管理的,因此没有真正的事务管理。这绝不会像产品应用程序那样,由带有控制器bean、服务等的应用程序服务器进行管理

然后我明白了。。。“服务”。。。我将有一个服务层,这是事务支持的所在。所以,就像rain一样,我创建了一个简单的服务bean(用@Transactional标记),它的工作方式和我希望的一样。所以,我在我的服务上调用方法,它在我的Dao和bam上调用方法!!!它起作用了


再次感谢所有帮助我得出这个结论的人。

对不起。。。这有点让人困惑。。。我正在用@Repository注释创建DAO…抱歉。。。这有点让人困惑。。。我正在用@Repository注释创建DAO……是的,这就是我的配置的所有意图和目的。我还有一个SessionFactorybean,其中引用了我的hibernate配置。。。我有一个HibernateTemplate,其中引用了我的SessionFactory bean,还有一个HibernateTransactionManager,其中引用了我的SessionFactory bean。是的,这正是我的配置看起来的样子。我还有一个SessionFactorybean,其中引用了我的hibernate配置。。。我有一个HibernateTemplate,它引用了我的SessionFactory bean,还有一个HibernateTransactionManager,它引用了我的SessionFactory bean。实际上,我走了这条路,似乎得到了相同的结果,但是,让我再试一次。HibernateTemplate不是解决问题的方法