Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.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
Spring @事务性批注不工作_Spring_Hibernate_Spring Transactions - Fatal编程技术网

Spring @事务性批注不工作

Spring @事务性批注不工作,spring,hibernate,spring-transactions,Spring,Hibernate,Spring Transactions,我试图在数据库中保存一个TestEntity对象。正在执行代码并创建实体的Id,但实体未持久化到数据库(未插入行): <!-- Our service layer components --> <context:component-scan base-package="com.homecare" /> <!-- <context:component-scan base-package="com.homecare.persistance.repository"

我试图在数据库中保存一个
TestEntity
对象。正在执行代码并创建实体的Id,但实体未持久化到数据库(未插入行):

<!-- Our service layer components -->
<context:component-scan base-package="com.homecare" />
<!-- <context:component-scan base-package="com.homecare.persistance.repository" /> -->


 <!-- enable @Transactional Annotation -->



<!-- data source with c3p0 -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
      <property name="driverClassName" value="org.postgresql.Driver" />
      <property name="url" value="jdbc:postgresql://localhost:5433/My_DB" />
      <property name="username" value="postgres" />
      <property name="password" value="password" />
   </bean>

   <bean id="SessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
      <property name="dataSource" ref="dataSource" />
      <property name="packagesToScan" value="com.homecare.persistance.resource"></property>   <!-- yet to defined place where to scan> -->
      <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
            </props>
        </property>
    </bean>

    <tx:annotation-driven transaction-manager="transactionManager"/>
    <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
      <property name="sessionFactory" ref="SessionFactory" />
   </bean>
</beans>
从3行(beginTranslation、flush、commit)中删除注释可以解决问题,但是为什么
@Transactional
注释在这里不起作用

<!-- Our service layer components -->
<context:component-scan base-package="com.homecare" />
<!-- <context:component-scan base-package="com.homecare.persistance.repository" /> -->


 <!-- enable @Transactional Annotation -->



<!-- data source with c3p0 -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
      <property name="driverClassName" value="org.postgresql.Driver" />
      <property name="url" value="jdbc:postgresql://localhost:5433/My_DB" />
      <property name="username" value="postgres" />
      <property name="password" value="password" />
   </bean>

   <bean id="SessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
      <property name="dataSource" ref="dataSource" />
      <property name="packagesToScan" value="com.homecare.persistance.resource"></property>   <!-- yet to defined place where to scan> -->
      <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
            </props>
        </property>
    </bean>

    <tx:annotation-driven transaction-manager="transactionManager"/>
    <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
      <property name="sessionFactory" ref="SessionFactory" />
   </bean>
</beans>
Spring XML:

<!-- Our service layer components -->
<context:component-scan base-package="com.homecare" />
<!-- <context:component-scan base-package="com.homecare.persistance.repository" /> -->


 <!-- enable @Transactional Annotation -->



<!-- data source with c3p0 -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
      <property name="driverClassName" value="org.postgresql.Driver" />
      <property name="url" value="jdbc:postgresql://localhost:5433/My_DB" />
      <property name="username" value="postgres" />
      <property name="password" value="password" />
   </bean>

   <bean id="SessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
      <property name="dataSource" ref="dataSource" />
      <property name="packagesToScan" value="com.homecare.persistance.resource"></property>   <!-- yet to defined place where to scan> -->
      <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
            </props>
        </property>
    </bean>

    <tx:annotation-driven transaction-manager="transactionManager"/>
    <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
      <property name="sessionFactory" ref="SessionFactory" />
   </bean>
</beans>

org.hibernate.dialogue.PostgreSqlDialogue
真的
更新
POM xml文件:

<!-- Our service layer components -->
<context:component-scan base-package="com.homecare" />
<!-- <context:component-scan base-package="com.homecare.persistance.repository" /> -->


 <!-- enable @Transactional Annotation -->



<!-- data source with c3p0 -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
      <property name="driverClassName" value="org.postgresql.Driver" />
      <property name="url" value="jdbc:postgresql://localhost:5433/My_DB" />
      <property name="username" value="postgres" />
      <property name="password" value="password" />
   </bean>

   <bean id="SessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
      <property name="dataSource" ref="dataSource" />
      <property name="packagesToScan" value="com.homecare.persistance.resource"></property>   <!-- yet to defined place where to scan> -->
      <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
            </props>
        </property>
    </bean>

    <tx:annotation-driven transaction-manager="transactionManager"/>
    <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
      <property name="sessionFactory" ref="SessionFactory" />
   </bean>
</beans>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>4.3.2.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>4.3.2.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>4.3.2.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-orm</artifactId>
    <version>4.3.2.RELEASE</version>
</dependency>



<!-- spring framwork -->
<!-- Hibernate -->
       <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>4.3.11.Final</version>
       </dependency>
        <dependency>
           <groupId>net.sf.ehcache</groupId>
           <artifactId>ehcache-core</artifactId>
           <version>2.2.0</version>
       </dependency>

org.springframework
spring上下文
4.3.2.1发布
org.springframework
弹簧芯
4.3.2.1发布
org.springframework
SpringWebMVC
4.3.2.1发布
org.springframework
春季甲虫
4.3.2.1发布
org.hibernate
冬眠核心
4.3.11.4最终版本
net.sf.ehcache
ehcache内核
2.2.0

用于保存的Hibernate会话对象未绑定到spring配置xml中定义的事务管理器

<!-- Our service layer components -->
<context:component-scan base-package="com.homecare" />
<!-- <context:component-scan base-package="com.homecare.persistance.repository" /> -->


 <!-- enable @Transactional Annotation -->



<!-- data source with c3p0 -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
      <property name="driverClassName" value="org.postgresql.Driver" />
      <property name="url" value="jdbc:postgresql://localhost:5433/My_DB" />
      <property name="username" value="postgres" />
      <property name="password" value="password" />
   </bean>

   <bean id="SessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
      <property name="dataSource" ref="dataSource" />
      <property name="packagesToScan" value="com.homecare.persistance.resource"></property>   <!-- yet to defined place where to scan> -->
      <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
            </props>
        </property>
    </bean>

    <tx:annotation-driven transaction-manager="transactionManager"/>
    <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
      <property name="sessionFactory" ref="SessionFactory" />
   </bean>
</beans>
使用autowired as定义sessionfactory对象

<!-- Our service layer components -->
<context:component-scan base-package="com.homecare" />
<!-- <context:component-scan base-package="com.homecare.persistance.repository" /> -->


 <!-- enable @Transactional Annotation -->



<!-- data source with c3p0 -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
      <property name="driverClassName" value="org.postgresql.Driver" />
      <property name="url" value="jdbc:postgresql://localhost:5433/My_DB" />
      <property name="username" value="postgres" />
      <property name="password" value="password" />
   </bean>

   <bean id="SessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
      <property name="dataSource" ref="dataSource" />
      <property name="packagesToScan" value="com.homecare.persistance.resource"></property>   <!-- yet to defined place where to scan> -->
      <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
            </props>
        </property>
    </bean>

    <tx:annotation-driven transaction-manager="transactionManager"/>
    <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
      <property name="sessionFactory" ref="SessionFactory" />
   </bean>
</beans>
@Autowired
Private SessionFactory sessionFactory;
并将会话对象作为

<!-- Our service layer components -->
<context:component-scan base-package="com.homecare" />
<!-- <context:component-scan base-package="com.homecare.persistance.repository" /> -->


 <!-- enable @Transactional Annotation -->



<!-- data source with c3p0 -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
      <property name="driverClassName" value="org.postgresql.Driver" />
      <property name="url" value="jdbc:postgresql://localhost:5433/My_DB" />
      <property name="username" value="postgres" />
      <property name="password" value="password" />
   </bean>

   <bean id="SessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
      <property name="dataSource" ref="dataSource" />
      <property name="packagesToScan" value="com.homecare.persistance.resource"></property>   <!-- yet to defined place where to scan> -->
      <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
            </props>
        </property>
    </bean>

    <tx:annotation-driven transaction-manager="transactionManager"/>
    <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
      <property name="sessionFactory" ref="SessionFactory" />
   </bean>
</beans>
Session session = sessionFactory.getCurrentSession();
现在执行session.save(对象)

<!-- Our service layer components -->
<context:component-scan base-package="com.homecare" />
<!-- <context:component-scan base-package="com.homecare.persistance.repository" /> -->


 <!-- enable @Transactional Annotation -->



<!-- data source with c3p0 -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
      <property name="driverClassName" value="org.postgresql.Driver" />
      <property name="url" value="jdbc:postgresql://localhost:5433/My_DB" />
      <property name="username" value="postgres" />
      <property name="password" value="password" />
   </bean>

   <bean id="SessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
      <property name="dataSource" ref="dataSource" />
      <property name="packagesToScan" value="com.homecare.persistance.resource"></property>   <!-- yet to defined place where to scan> -->
      <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
            </props>
        </property>
    </bean>

    <tx:annotation-driven transaction-manager="transactionManager"/>
    <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
      <property name="sessionFactory" ref="SessionFactory" />
   </bean>
</beans>

根据代码中的spring配置,sessionFactory与transactionManager相关联。因此,当事务成功完成时,在会话(与事务管理器关联)中执行的所有更改都将在db中提交。

尝试覆盖getSession()方法:

<!-- Our service layer components -->
<context:component-scan base-package="com.homecare" />
<!-- <context:component-scan base-package="com.homecare.persistance.repository" /> -->


 <!-- enable @Transactional Annotation -->



<!-- data source with c3p0 -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
      <property name="driverClassName" value="org.postgresql.Driver" />
      <property name="url" value="jdbc:postgresql://localhost:5433/My_DB" />
      <property name="username" value="postgres" />
      <property name="password" value="password" />
   </bean>

   <bean id="SessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
      <property name="dataSource" ref="dataSource" />
      <property name="packagesToScan" value="com.homecare.persistance.resource"></property>   <!-- yet to defined place where to scan> -->
      <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
            </props>
        </property>
    </bean>

    <tx:annotation-driven transaction-manager="transactionManager"/>
    <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
      <property name="sessionFactory" ref="SessionFactory" />
   </bean>
</beans>

我没有看到启用事务管理的
,它在spring xml文件中(最后三个标记):我只使用Autowired注释注入SessionFactory对象。而事务注释也可以与openSession()一起使用,那么为什么要使用SessionFactory.getCurrentSession()。我还以注入SessionFactory对象的方式更新了代码。SessionFactory.openSession()总是打开一个新会话,在完成操作后必须关闭该会话。getCurrentSession()返回绑定到上下文的会话-您不需要关闭它。是的,这很好。但我的问题不同。我的实际问题是为什么spring事务注释功能不起作用?您是否尝试通过更改为sessionFactory.getCurrentSession()来测试事务提交?。如果仍然不工作,您可以添加true。谢谢Vijay。它在sessionFactory.getCurrentSession()上运行良好,并且不使用true标记。但这让我有些怀疑。第一个问题是:为什么sessionFactory.openSession()不能使用它?第二个是:为了使sessionFactory.getCurrentSession()工作,我们假设在SpringXML文件中添加线程。但在这里,我没有添加它,但仍在工作。您能帮我解决这个问题吗?在进行上述更改之后,实体仍然没有提交到数据库。