我使用Spring data
我的項目,我使用的是標準Repository
是extends CRUD Repository
。Spring JPA:Save()方法應該向數據庫提交數據嗎?
我的代碼按預期工作,但是當我撥打repository.save()
數據庫是而不是改變了?
難道我還需要再調用這個後一個commit
爲了改變數據庫?還是應該repository.save()
方法自動更改數據庫?
我使用Spring data
我的項目,我使用的是標準Repository
是extends CRUD Repository
。Spring JPA:Save()方法應該向數據庫提交數據嗎?
我的代碼按預期工作,但是當我撥打repository.save()
數據庫是而不是改變了?
難道我還需要再調用這個後一個commit
爲了改變數據庫?還是應該repository.save()
方法自動更改數據庫?
當你的應用程序運行時,與線程關聯的實體管理器會修改或添加對象的控制,保存()方法只是這樣做,這是一個標誌,上面寫着:「這應該是保存在數據庫中。」
數據庫DML(插入,更新,刪除),而保存的東西不會被髮送到數據庫中,它是在年底剛剛完成提交之前,它推遲到最後一刻。
使用實體管理器的flush()方法,您可以在任何時候發送DML到數據庫,事實上,您可以調試數據庫日誌並查看您的查詢,但對數據庫的更改只會顯示在您的數據庫連接中,直到發出提交; commit()是與實體管理器關聯的事務的一種方法。
在喜歡打一些框架的1.4.x後的反應觀點是正確的解析和渲染髮出的提交。
再見, 漢斯
如果配置這樣
<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任何方法將啓動,如果沒有異常被拋出提交事務。
嗨,夥計, 請看看我的用例[這裏](http://stackoverflow.com/questions/39679766/jparepository-save-method-does-not-commit-using-derby-db) 我我無法通過JpaRepository.save()方法提交更改。 –
同樣的事情......並沒有很好地理解事務在這種情況下是如何工作的。 – Sergey
當您使用上面的相應配置添加@Transaction註解時,Spring容器將代理您的類,並且它會將代碼(如transaction.begin(),transaction.commit()和transaction.rollback())添加到代理中,實際運行的代碼。或者,如果您喜歡spring容器將交易代碼添加到您的課程並運行它。 –
通常,save方法應該被封裝在一個事務中(spring-data爲你透明地執行)。如果您編寫自己的方法,則需要使用@ Transactional註釋修改方法。 – fateddy
我已註釋了我正在調用的主要方法,並保存了一個事務性註釋但仍不起作用 – java123999
您可以發佈存儲庫的代碼,包括保存方法+ TransactionManager配置嗎? – fateddy