5

私は、他の 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 は外部キーですか?

4

1 に答える 1

6

getReference()find() を使用してエンティティをロードするのではなく、EntityManager のメソッドを使用して「参照」インスタンスを取得できます。これらの参照は遅延フェッチされるため、あなたの場合、それらをフェッチする必要はまったくありません。

コードは次のようになります。

A a = entityManager.getReference(A.class, knownIdForA);
B b = entityManager.getReference(B.class, knownIdForB);

X x = new X();
x.setA(a);
x.setB(b);

entityManager.persist(x);

ただし、persist() 呼び出しのみが DB にアクセスします。

于 2012-08-27T13:10:03.550 に答える