2016-02-26 167 views
2

我使用Spring data我的项目,我使用的是标准Repositoryextends CRUD RepositorySpring JPA:Save()方法应该向数据库提交数据吗?

我的代码按预期工作,但是当我拨打repository.save()数据库是而不是改变了?

难道我还需要再调用这个后一个commit为了改变数据库?还是应该repository.save()方法自动更改数据库?

+0

通常,save方法应该被封装在一个事务中(spring-data为你透明地执行)。如果您编写自己的方法,则需要使用@ Transactional注释修改方法。 – fateddy

+0

我已注释了我正在调用的主要方法,并保存了一个事务性注释但仍不起作用 – java123999

+0

您可以发布存储库的代码,包括保存方法+ TransactionManager配置吗? – fateddy

回答

2

当你的应用程序运行时,与线程关联的实体管理器会修改或添加对象的控制,保存()方法只是这样做,这是一个标志,上面写着:“这应该是保存在数据库中。”

数据库DML(插入,更新,删除),而保存的东西不会被发送到数据库中,它是在年底刚刚完成提交之前,它推迟到最后一刻。

使用实体管理器的flush()方法,您可以在任何时候发送DML到数据库,事实上,您可以调试数据库日志并查看您的查询,但对数据库的更改只会显示在您的数据库连接中,直到发出提交; commit()是与实体管理器关联的事务的一种方法。

在喜欢打一些框架的1.4.x后的反应观点是正确的解析和渲染发出的提交。

再见, 汉斯

0

如果配置这样

<tx:annotation-driven /> 
<jpa:repositories base-package="com.greg" /> 

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" value="org.h2.Driver" /> 
    <property name="url" value="jdbc:h2:mem:test;DB_CLOSE_DELAY=-1" /> 
</bean> 

<bean id="entityManagerFactory" 
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="packagesToScan" value="com.greg" /> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" /> 
    </property> 
    <property name="jpaProperties"> 
     <props> 
      <prop key="hibernate.hbm2ddl.auto">create</prop> 
      <prop key="hibernate.show_sql">true</prop> 
      <prop key="hibernate.dialect">org.hibernate.dialect.H2Dialect</prop> 
     </props> 
    </property> 
</bean> 

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory" ref="entityManagerFactory" /> 
</bean> 

然后被标注了@Transaction任何方法将启动,如果没有异常被抛出提交事务。

+0

嗨,伙计, 请看看我的用例[这里](http://stackoverflow.com/questions/39679766/jparepository-save-method-does-not-commit-using-derby-db) 我我无法通过JpaRepository.save()方法提交更改。 –

+0

同样的事情......并没有很好地理解事务在这种情况下是如何工作的。 – Sergey

+0

当您使用上面的相应配置添加@Transaction注解时,Spring容器将代理您的类,并且它会将代码(如transaction.begin(),transaction.commit()和transaction.rollback())添加到代理中,实际运行的代码。或者,如果您喜欢spring容器将交易代码添加到您的课程并运行它。 –