0

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

integrity constraint (FK_008) violated - parent key not found

我想我明白这一点,因为 jdbctemplate 可能正在使用另一个会话,因此是另一个事务。我尝试在执行 4000+ 次插入的方法上设置 propegation:required 事务属性,期望事务的加入足以读取新的未提交父 ID,但这显然还不够。我希望我能以某种方式将休眠会话连接到 spring 的 jdbctemplate 但到目前为止我还不能这样做。SpringJDBC 以dataSource 作为参数,jtatransaction manager 以Hibernate SessionFactory 为参数,到目前为止,我觉得东西方是东西方,永远不会相遇。还有其他方法可以让 Spring 的 jdbctemplate 参与 Hibernate 的 Session 吗?(除了追求父母的承诺'

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);
}

希望有人可以在这里帮助我。

干杯,杰伦

4

2 回答 2

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();
于 2011-04-19T08:59:12.693 回答
0

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

于 2011-04-19T10:06:26.567 回答