2016-02-26 86 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容器將交易代碼添加到您的課程並運行它。 –