使用JPA和Spring时从hibernate手动关闭会话

使用JPA和Spring时从hibernate手动关闭会话,spring,hibernate,session,jpa,batch-processing,Spring,Hibernate,Session,Jpa,Batch Processing,如果我希望使用批插入,我相信我必须使用hibernate来处理,因为JPA不支持它。我的问题是我应该如何处理这个会议。例如: @Transactional public void persistData() { Session session = entityManager.unwrap(Session.class); for (int i = 0; i < 100; i++){ CRR crr = new CRR();

如果我希望使用批插入,我相信我必须使用hibernate来处理,因为JPA不支持它。我的问题是我应该如何处理这个会议。例如:

@Transactional
public void persistData() {
        Session session = entityManager.unwrap(Session.class);
        for (int i = 0; i < 100; i++){
            CRR crr = new CRR();
            session.save(crr);
            if ( i % 20 == 0 ) { 
                session.flush();
                session.clear();
            }
        }
}

在方法结束时,还是可以依靠请求结束时关闭的会话?

在您尝试实现的过程中没有特定于Hibernate的内容,JPA中支持相同的基本操作:

for (int i = 0; i < 100; i++){
    CRR crr = new CRR();
    entityManager.persist(crr);
    if ( i % 20 == 0 ) { 
        entityManager.flush();
        entityManager.clear();
    }
}
for(int i=0;i<100;i++){
CRR CRR=新的CRR();
entityManager.persist(crr);
如果(i%20==0){
entityManager.flush();
entityManager.clear();
}
}
由于这段代码没有什么不寻常的地方,您也不需要为手动会话处理做任何事情

可能您将此模式与使用特定于Hibernate且需要手动会话管理的
无状态会话的批处理操作的不同方法混淆了

for (int i = 0; i < 100; i++){
    CRR crr = new CRR();
    entityManager.persist(crr);
    if ( i % 20 == 0 ) { 
        entityManager.flush();
        entityManager.clear();
    }
}