0

短い質問の下の長い話: Spring の NamedParameterJDBCTemplate を Hibernate のセッションに参加させるにはどうすればよいですか? Spring と Hibernate を使用するアプリケーションがあり、データレイヤー全体は Hibernate を使用しています。しかし今、休止状態ロジック全体が配置されている親オブジェクトがあるユースケースがあります。親オブジェクトには多く (> 4000) の詳細があり、Spring の jdbctemplate を使用して (hibernate を使用する代わりに) すべて 1 つのトランザクションに挿入したいと考えています。親オブジェクトが保存され、親の ID (Oracle シーケンス) が設定され、オブジェクトを介して読み取り可能になります。永続的に保存するには、コミットするだけです。トランザクション境界は、詳細の 4000 以上の jdbctemplate 挿入も起動するメソッドに設定されます。詳細である詳細には、親の ID である親オブジェクトへの参照が必要です。4000 以上の挿入が実行されているときに利用できます。ただし、最初の詳細の挿入では、

integrity constraint (FK_008) violated - parent key not found

jdbctemplateはおそらく別のセッションを使用しているため、別のトランザクションを使用しているため、私はそれを理解していると思います。4000 回以上の挿入を行うメソッドに propegation:required トランザクション属性を設定しようとしましたが、コミットされていない新しい親 ID を読み取るにはトランザクションの結合で十分であると期待していましたが、明らかに十分ではありませんでした。どうにかして休止状態セッションを春の jdbctemplate に配線できることを望んでいますが、これまでのところそうできていません。SpringJDBC は引数として dataSource を受け取り、jtatransaction マネージャーは Hibernate SessionFactory を受け取ります。これまでのところ、東と西は東と西であり、両者が出会うことはないと感じています。Spring の jdbctemplate を Hibernate のセッションに参加させる他の方法はありますか? (親をコミットするコースを除く)

HibernateSessionFactoryは、引数の 1 つとして dataSource を持つ org.springframework.orm.hibernate3.LocalSessionFactoryBean です。

TransactionManagerは、引数として sessionFactory を取得する org.springframework.orm.hibernate3.HibernateTransactionManager です。

NamedParameterJDBCTemplateは、sqlInserter のセッターで作成されます。

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 に答える