Spring的NamedParameterJDBCTemplate加入了Hibernate的会话?

时间:2011-04-19 07:35:04

标签: java hibernate spring transactionscope jdbctemplate

下面的简短问题:如何让Spring的NamedParameterJDBCTemplate加入Hibernate的会话? 我们有一个使用Spring和Hibernate的应用程序,我们的整个数据层都是Hibernate。但是现在有一个用例,我们有一个父对象,整个hibernate逻辑就位。父对象有很多(> 4000)细节,我们确实希望使用Spring的jdbctemplate插入,所有这些都在一个事务中(而不是使用hibernate)。保存父对象,设置Parent的id(这是一个oracle序列),并通过该对象读取。我们只需要提交以永久存储它。 事务边界设置在一个方法上,该方法还会触发详细信息的4000+ jdbctemplate插入。 作为细节的细节确实需要引用父对象,父对象是父进程的id,在执行4000+插入时可用。但是在插入第一个细节时,我得到了一个

integrity constraint (FK_008) violated - parent key not found

我想我明白了,因为jdbctemplate可能正在使用另一个会话,因此另一个事务。我尝试在执行4000+插入的方法上设置propegation:required事务属性,期望事务的连接足以能够读取新的未提交的父ID,但这显然不够。 我希望我能以某种方式将hibernate会话连接到spring的jdbctemplate,但到目前为止我还没有能够这样做。 SpringJDBC将dataSource作为参数,jtatransaction管理器接受Hibernate SessionFactory,到目前为止,我感觉东方是东方和西方,而不是twain应该满足。还有其他方法,让Spring的jdbctemplate参与Hibernate的Session吗? (除了提交父级插入之外,所以父级id可用于jdbctemplate)。

HibernateSessionFactory 是一个org.springframework.orm.hibernate3.LocalSessionFactoryBean 将dataSource作为参数之一。

TransactionManager 是org.springframework.orm.hibernate3.HibernateTransactionManager,它将sessionFactory作为参数。

NamedParameterJDBCTemplate 是在sqlInserter的setter中创建的:

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

希望有人可以帮助我。

干杯, 的Jeroen

2 个答案:

答案 0 :(得分:2)

您应该通过批量更新技术通过Hibernate进行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();

答案 1 :(得分:0)

问题是插入父对象后我需要做一个Session.flush。这会强制执行insert语句(在事务中),并且会话中的持久父对象可用,对我而言,它现在就像魅力一样。