2013-03-17 27 views

答えて

11

ソリューションは、このStatelessSessionを作成して、カスタムリポジトリの実装でそれを注入する春のファクトリーBeanを実装することです:

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とフル要旨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

あなたはSessionFactoryの設定(すなわち:LocalEntityManagerFactoryBean)にhibernate.jdbc.batch_sizeプロパティを設定することによりSessionFactory/EntityManager上のJDBCバッチ文を有効にすることができた結果、より良いパフォーマンスを得るために。

jdbcの最適な利点を得るには、挿入/更新をできるだけ多くのエンティティで実行します。 Hibernateは、別のエンティティタイプを書き込むときにそれを検出し、設定されたバッチサイズに達していなくても自動的にバッチをフラッシュします。 StatelessSessionを使用して

は、基本的には、SpringのJdbcTemplateのようなものを使用するのと同じ動作をします。 StatelessSessionを使用する利点は、SQLへのマッピングと変換がHibernateによって処理されることです。あなたが私を使用する場合StatelessSessionFactoryBeanあなたも、1つのトランザクションで混合SessionStatelessSessionを混在させることができます。しかしSessionによってロードされたエンティティを変更し、それが問題をロックになりますのでStatelessSessionでそれを持続するように注意してください。それはあなたがこれでそれを行うことができますnecesaryいない

-3

:セッションは、データベース接続を保持しているので

public void bulkInsert(Collection<YourClass> yourObjects) 
    { 

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

    } 
関連する問題