私は、他の 2 つのエンティティを参照する多数の行を作成するアプリケーションを使用しています。つまり、行には、ManyToOne 関係を実現する 2 つの外部キー参照があります。
参照されている 2 つのエンティティは次のとおりです。
CREATE TABLE a (
`id` INT NOT NULL auto_increment,
-- lots of other attributes,
PRIMARY KEY (id)
)
CREATE TABLE b (
`id` INT NOT NULL auto_increment,
-- lots of other attributes,
PRIMARY KEY (id)
)
これは、a と b を参照するエンティティです。
CREATE TABLE x (
`id` INT NOT NULL auto_increment,
`f_a` INT NOT NULL,
`f_b` INT NOT NULL,
CONSTRAINT `FK_a` FOREIGN KEY (`f_a`) REFERENCES `a` (`id`),
CONSTRAINT `FK_b` FOREIGN KEY (`f_b`) REFERENCES `b` (`id`),
)
a、b、および x は、EclipseLink を介して JPA を使用してクラス A、B、および X にマップされます。これは非常に基本的なものであり、特別なことは何もありません。
Java で X を作成するときは、次のようにします (a と b は既に存在し、それらの ID しか知らないことに注意してください。これらはレガシー アプリケーションから供給されます)。
A a = entityManager.find(A.class, knownIdForA);
B b = entityManager.find(B.class, knownIdForB);
X x = new X();
x.setA(a);
x.setB(b);
entityManager.persist(x);
問題は、約 200,000 のエンティティを挿入する必要があることです。これはかなりの数です。A と B はそれぞれ約 3 倍あるので、A と B を 200,000 回フェッチする必要があり、おそらく 200,000 の異なる A と B をフェッチする必要があるため、キャッシュでできることはあまりありません。
私の質問は次のとおりです。エンティティ全体を取得する必要は本当にありますか? これらのコストを削減する方法はありますか? または、JPA の利点を失うことなく (つまり、独自のクエリを作成する必要がない)、手動で外部キー参照 (整数に要約される) を設定できる方法はありますか?
質問の別の定式化: JPA で次のことを達成するにはどうすればよいですか?
INSERT INTO x (`f_a`, `f_b`) VALUES (13, 17);
f_a と f_b は外部キーですか?