Java 使用Hibernate和;春天
我的应用程序基于Hibernate3.2和Spring2.5。以下是应用程序上下文中与事务管理相关的代码段:Java 使用Hibernate和;春天,java,spring,hibernate,spring-batch,insertion,Java,Spring,Hibernate,Spring Batch,Insertion,我的应用程序基于Hibernate3.2和Spring2.5。以下是应用程序上下文中与事务管理相关的代码段: <tx:annotation-driven transaction-manager="txManager"/> <bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name=
<tx:annotation-driven transaction-manager="txManager"/>
<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
<property name="nestedTransactionAllowed" value="true"/>
</bean>
<bean id="transactionTemplate" classs="org.springframework.transaction.support.TransactionTemplate">
<property name="transactionManager" ref="txManager"/>
</bean>
<bean class="org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor"/>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="configLocation" value="classpath:/hibernate.cfg.xml"></property>
</bean>
这是我的应用程序中唯一的一个方法,在该方法中,我启动这样的事务,并在方法末尾提交它。否则,我通常只调用getHibernateTemplate.save()
。我不确定是否应该通过将@Transactional(readOnly=false,PROPOGATION=NEW)
放在save()
上,在DAO中单独执行此save方法的事务管理,或者这种方法可以吗
我还将hibernate.cfg配置文件中的hibernate.jdbc.batch_size
更新为20
有什么建议吗?我会重构
解析
,它不会直接调用save
,而是从服务层进行回调。服务层将通过save
调用传递其事务方法作为此回调
它可能无法完全按照您案例中的描述工作,但从这个简短的描述中,我会尝试使用它。您只需要刷新和清除会话的位。将事务管理留给Spring。使用sessionFactory.getCurrentSession()访问Spring已经为您打开的会话。此外,Spring最近的重新编译是为了避免HibernateTemplate并直接使用Hibernate的API。将SessionFactory注入dao bean。对于hibernate的批插入,最佳实践是无状态会话,它不会缓存实体的任何状态,您不会遇到OutOfMemory,代码如下:
if (books == null || books.isEmpty) {
return;
}
StatelessSession session = getHibernateTemplate().getSessionFactory().openStatelessSession();
Transaction tx = session.beginTransaction();
for (Book each : books) {
session.insert(book);
}
tx.commit();
session.close();
无状态会话的事务独立于当前事务上下文
if (books == null || books.isEmpty) {
return;
}
StatelessSession session = getHibernateTemplate().getSessionFactory().openStatelessSession();
Transaction tx = session.beginTransaction();
for (Book each : books) {
session.insert(book);
}
tx.commit();
session.close();