2011-04-19 50 views
0

簡短的問題之下的長話短說:我怎樣才能讓Spring的NamedParameterJDBCTemplate加入Hibernate的會話? 我們有一個使用Spring和Hibernate的應用程序,我們的整個數據層都是Hibernate。但是現在有一個用例,我們有一個父對象,整個hibernate邏輯就位。父對象有許多(> 4000)細節,我們希望使用Spring的jdbctemplate插入所有細節,所有這些細節都在一個事務中(而不是使用hibernate)。父對象被保存,Parent的id(它是一個oracle序列)被設置,並且可以通過對象讀取。我們只需要承諾永久存儲它。 事務邊界在一個方法上設置,該方法還會觸發4000+ jdbctemplate插入的細節。 細節,作爲細節,確實需要對父對象的引用,這是父對象的ID,在執行4000+插入時可用。然而在第一個明細的插入,我得到一個Spring的NamedParameterJDBCTemplate加入Hibernate的會話?

integrity constraint (FK_008) violated - parent key not found

我想我明白,作爲JdbcTemplate的可能是使用另一個會話,併爲此另一個事務。我嘗試設置一個propegation:在執行4000+插入的方法上需要的事務屬性,期望事務的連接足以能夠讀取新的未提交的父ID,但這顯然是不夠的。 我希望我能以某種方式將hibernate會話連接到spring的jdbctemplate,但到目前爲止我還沒有做到。 SpringJDBC將dataSource作爲參數,jtatransaction管理器接受Hibernate SessionFactory,到目前爲止,我感覺東部是東部和西部,而不是兩個會合。還有其他的方法,讓Spring的jdbctemplate參與Hibernate的Session嗎? (除了提交父對象的insert之外,父對象可用於jdbctemplate)。

HibernateSessionFactory是org.springframework.orm.hibernate3.LocalSessionFactoryBean 與數據源作爲參數之一。

TransactionManager是獲取sessionFactory作爲參數的org.springframework.orm.hibernate3.HibernateTransactionManager。

是NamedParameterJdbcTemplate在sqlInserter的二傳手創建:

public void setDataSource(DataSource dataSource) { 
    jdbcTemplate = new NamedParameterJdbcTemplate(dataSource); 
} 

希望有人能幫助我在這裏。

乾杯, 吉榮

回答

2

你應該通過批量更新技術通過休眠做你的4000+插入。 :

Session session = sessionFactory.openSession(); 
Transaction tx = session.beginTransaction(); 

ScrollableResults customers = session.getNamedQuery("GetCustomers") 
    .setCacheMode(CacheMode.IGNORE) 
    .scroll(ScrollMode.FORWARD_ONLY); 
int count=0; 
while (customers.next()) { 
    Customer customer = (Customer) customers.get(0); 
    customer.updateStuff(...); 
    if (++count % 20 == 0) { 
     //flush a batch of updates and release memory: 
     session.flush(); 
     session.clear(); 
    } 
} 

tx.commit(); 
session.close(); 
+0

問題是客戶對象不可用,所有數據都在哈希列表中。構建它的對象是我認爲的cpu循環的腰部。 – 2011-04-19 10:02:20

0

問題是插入父對象後,我需要做一個Session.flush。這會強制執行插入語句(在事務中),並且永久父對象在會話中可用,對我來說它現在就像一個魅力一樣。