我在我的應用程序中使用spring和hibernate並使用spring事務。hibernate session.flush with spring @transactional
所以我有服務層註釋@transaction方法和DAO層有數據庫查詢方法。
@Transactional(readOnly = false)
public void get(){
}
的問題是,當我要保存一個對象在數據庫中,然後我在DAO層method.Why結束使用session.flush()
?
我想如果我有註解@事務,那麼spring應該在服務方法完成時自動提交事務。
DAO層:
public BaseEntity saveEntity(BaseEntity entity) throws Exception {
try {
Session session = sessionFactory.getCurrentSession();
session.saveOrUpdate(entity);
session.flush();
} catch (HibernateException he) {
throw new Exception("Failed to save entity " + entity);
}
return entity;
}
服務層:
@Transactional(readOnly = false)
public BaseEntity saveEntity(BaseEntity entity) throws Exception {
return dao.saveEntity(entity);
}
Spring配置:
<context:property-placeholder properties-ref="deployProperties" />
<tx:annotation-driven transaction-manager="transactionManager" />
<!-- Activate Spring Data JPA repository support -->
<jpa:repositories base-package="com" />
<!-- Declare a datasource that has pooling capabilities-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close"
p:driverClass="${app.jdbc.driverClassName}"
p:jdbcUrl="${app.jdbc.url}"
p:user="${app.jdbc.username}"
p:password="${app.jdbc.password}"
p:acquireIncrement="5"
p:idleConnectionTestPeriod="60"
p:maxPoolSize="100"
p:maxStatements="50"
p:minPoolSize="10" />
<!-- Declare a JPA entityManagerFactory -->
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
p:persistenceXmlLocation="classpath*:META-INF/persistence.xml"
p:persistenceUnitName="hibernatePersistenceUnit"
p:dataSource-ref="dataSource"
p:jpaVendorAdapter-ref="hibernateVendor"/>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"
p:dataSource-ref="dataSource" p:configLocation="${hibernate.config}"
p:packagesToScan="com" />
<!-- Specify our ORM vendor -->
<bean id="hibernateVendor" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"
p:showSql="false"/>
<!-- Declare a transaction manager-->
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"
p:entityManagerFactory-ref="entityManagerFactory"/>
春天爲你做,'readonly = false'是默認的,你沒有聲明 – Jaiwo99 2014-09-30 12:53:06
我認爲自動提交併不打算立即刷新'Session'到數據庫,但是在該事務中完成的更改可用於使用同一'Session'的其他事務。 – 2014-09-30 12:55:21
如果你會正確設置交易,那麼是的......但是你的設置是有缺陷的。你爲什麼同時使用'SessionFactory'和'EntitymanagerFactory'?您只使用單個事務管理器。主要問題是你的設置。 – 2016-10-25 12:40:20