내 응용 프로그램에서 spring 및 hibernate를 사용하고 있으며 Spring 트랜잭션을 사용하고 있습니다.spring @transactional을 사용하여 최대 절전 모드 session.flush
그래서 나는 메소드와 주석에 @transaction을 가진 서비스 레이어를 가지고 있고 DAO 레이어는 데이터베이스 쿼리를위한 메소드를 가지고있다. 나는 데이터베이스에 객체를 저장할 때
@Transactional(readOnly = false)
public void get(){
}
문제는 내가 DAO 계층 method.Why의 끝에서 session.flush()
을 사용할 필요가있다?
나는 트랜잭션에 주석을 달았다면 스프링이 자동으로 서비스 메소드 완료시 트랜잭션을 커밋해야한다고 생각한다.
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);
}
스프링 설정 : 당신이 당신의 DAO 방법에 대한 @Transactional
이있는 경우
<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
자동 커밋은'Session'을 DB로 즉시 플러시하지 않을 것이라고 생각합니다. 해당 트랜잭션에서 변경된 사항을 동일한 '세션'으로 작업하는 다른 트랜잭션이 사용할 수있게합니다. –
그렇다면 제대로 거래를 설정해야합니다 ... 그러나 설정에 결함이 있습니다. 왜 당신은'SessionFactory'와'EntitymanagerFactory' 둘 다 사용하고 있습니까? 단일 트랜잭션 관리자 만 사용하고 있습니다. 주요 문제는 설정입니다. –