2013-03-17 66 views

回答

11

一個解決方案是實現一個Spring工廠bean創建這個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和全主旨here。使用Spring 3.2.2,Spring Data JPA 1.2.0和Hibernate 4.1.9。

感謝這個JIRA和誰連接StatelessSessionFactoryBean代碼的傢伙。希望這有助於某人,它對我來說就像一個魅力。

+1

由於會話持有數據庫連接,你關心你的statelessSession實例的生命週期? StatelessSession所持有的連接的生命週期是否與MyRepositoryImpl實例的生命週期基本相同? – mangotang

+0

它看起來像是一個代理,真實的無狀態會話由StatelessSessionSynchronization關閉 – user472749

2

爲了獲得更好的性能結果可以通過設置在SessionFactory的配置(即:LocalEntityManagerFactoryBean)的hibernate.jdbc.batch_size屬性啓用的SessionFactory/EntityManager JDBC批處理語句。

爲了獲得jdbc批量插入/更新的最佳益處,儘可能多地寫入相同類型的實體。當你編寫另一個實體類型時,Hibernate會檢測到它,即使它沒有達到配置的批量大小,它也會自動刷新批次。

使用StatelessSession的行爲與使用類似Spring的JdbcTemplate的行爲基本相同。使用StatelessSession的好處在於映射和轉換爲SQL由Hibernate處理。當您使用我的StatelessSessionFactoryBean時,您甚至可以混合在一次交易中混合使用SessionStatelessSession。但要小心修改由Session加載的實體並將其與StatelessSession一起保存,因爲這會導致鎖定問題。

-3

這不是necesary你可以用這個做到這一點:

public void bulkInsert(Collection<YourClass> yourObjects) 
    { 

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

    } 
相關問題