Java 使用Hibernate和;春天

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=

我的应用程序基于Hibernate3.2和Spring2.5。以下是应用程序上下文中与事务管理相关的代码段:

  <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();