2013-03-17 4 views

ответ

11

Решение состоит в том, чтобы внедрить Spring заводского боба, чтобы создать этот StatelessSession и впрыснуть его в реализации пользовательских репозиториев:

public class MyRepositoryImpl implements MyRepositoryCustom { 

    @Autowired 
    private StatelessSession statelessSession; 

    @Override 
    @Transactional 
    public void myBatchStatements() { 
     Criteria c = statelessSession.createCriteria(User.class); 

     ScrollableResults itemCursor = c.scroll(); 

     while (itemCursor.next()) { 
      myUpdate((User) itemCursor.get(0)); 
     } 
     itemCursor.close(); 

     return true; 
    } 

} 

Отъезда StatelessSessionFactoryBean и полный GIST here. Использование Spring 3.2.2, Spring Data JPA 1.2.0 и Hibernate 4.1.9.

Благодаря этому JIRA и парню, который приложил код StatelessSessionFactoryBean. Надеюсь, это помогает кому-то, это сработало для меня как шарм.

+1

Поскольку сеанс имеет соединение с базой данных, вы обеспокоены жизни вашего экземпляра statelessSession? Не будет ли время жизни соединения, принадлежащего statelessSession, по существу тем же самым, что и срок жизни экземпляра MyRepositoryImpl? – mangotang

+0

Похоже, что это прокси-сервер, а реальный statelessSession закрыт функцией StatelessSessionSynchronization – user472749

2

Чтобы получить еще более высокую производительность результаты, которые вы можете включить JDBC заявления партии на SessionFactory/EntityManager, установив hibernate.jdbc.batch_size свойство на SessionFactory конфигурации (т.е .: LocalEntityManagerFactoryBean).

Чтобы оптимально использовать вставку/обновления партии jdbc, записывайте как можно больше объектов одного типа. Hibernate будет обнаруживать, когда вы пишете другой тип сущности, и автоматически очищает пакет, даже если он не достиг определенного размера партии.

Использование StatelessSession ведет себя в основном так же, как использование чего-то вроде Spring's JdbcTemplate. Преимущество использования StatelessSession заключается в том, что преобразование и перевод в SQL обрабатывается Hibernate. Когда вы используете мой StatelessSessionFactoryBean, вы можете даже смешивать Session и StatelessSession, смешанные в одну транзакцию. Но будьте осторожны с модификацией объекта, загруженного Session, и сохраняя его с помощью StatelessSession, потому что это приведет к проблемам с блокировкой.

-3

Это не necesary вы можете сделать это с этим:

public void bulkInsert(Collection<YourClass> yourObjects) 
    { 

     if (yourObjects == null || yourObjects.isEmpty()) { 
      return; 
     } 
     yourRepository.save(yourObjects); 

    }