これは、jpa一括挿入に関するいくつかのトピックを読んだ後に作成した簡単な例です.2つの永続オブジェクトUserとSiteがあります. 1 人のユーザーが複数のサイトを持つことができるため、ここでは 1 対多の関係があります。ユーザーを作成し、いくつかのサイトをユーザー アカウントに作成/リンクしたいとします。Site オブジェクトに一括挿入を使用する意思があることを考慮して、コードは次のようになります。
User user = new User("John Doe");
user.getSites().add(new Site("google.com", user));
user.getSites().add(new Site("yahoo.com", user));
EntityTransaction tx = entityManager.getTransaction();
tx.begin();
entityManager.persist(user);
tx.commit();
しかし、このコードを実行すると (jpa 実装プロバイダーとして hibernate を使用しています)、次の sql 出力が表示されます。
Hibernate: insert into User (id, name) values (null, ?)
Hibernate: call identity()
Hibernate: insert into Site (id, url, user_id) values (null, ?, ?)
Hibernate: call identity()
Hibernate: insert into Site (id, url, user_id) values (null, ?, ?)
Hibernate: call identity()
つまり、「実際の」一括挿入が機能しないということですか、それとも混乱していますか?
このサンプル プロジェクトのソース コードは次のとおりです。これは maven プロジェクトなので、ダウンロードして mvn install を実行するだけで、出力を確認できます。
更新しました:
Ken Liu が親切にアドバイスした後、サイト オブジェクト ID の自動生成を無効にしました。
User user = new User("John Doe");
user.getSites().add(new Site(1, "google.com", user));
user.getSites().add(new Site(2, "yahoo.com", user));
entityManager.setFlushMode(FlushModeType.COMMIT);
EntityTransaction tx = entityManager.getTransaction();
tx.begin();
entityManager.persist(user);
tx.commit();
今、デバッグ出力に次の行があります。
デバッグ: org.hibernate.jdbc.AbstractBatcher - 実行バッチ サイズ: 2
できます!