gpt4 book ai didi

java - 使用 spring @transactional hibernate session.flush

转载 作者:IT老高 更新时间:2023-10-28 13:47:20 25 4
gpt4 key购买 nike

我在我的应用程序中使用 Spring 和 Hibernate 并使用 Spring Transaction。

所以我在方法上有一个带有注释 @Transaction 的服务层,而 DAO 层有用于数据库查询的方法。

@Transactional(readOnly = false)
public void get(){

}

问题是当我想在数据库中保存一个对象时,我必须在 DAO 层方法的末尾使用 session.flush()。为什么?

我想如果我注释了@Transaction,那么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"/>

最佳答案

是的,如果你的 DAO 方法有 @Transactional 那么你不需要手动刷新 session ,如果方法中的操作, hibernate 将负责刷新 session 作为提交事务的一部分成功了。

查看此链接以了解 @Transactional 的工作原理 - Spring - @Transactional - What happens in background?

关于java - 使用 spring @transactional hibernate session.flush,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26121297/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com