5

我有一个应用程序,它创建了许多引用其他两个实体的行,即行中有两个实现多对一关系的外键引用。

这些是被引用的两个实体:

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 个实体,这相当多。As 和 B 的数量分别大约是 3 倍,所以我必须获取 200,000 次 A 和 B,很可能是 200,000 个不同的 A 和 B,所以我对缓存无能为力。

我的问题是:真的有必要获取整个实体吗?有没有办法降低这些成本?或者有什么方法可以手动设置外键引用(归结为一个整数)而不会失去 JPA 的好处(即不必编写我自己的查询)?

问题的另一种表述:如何使用 JPA 完成以下任务?

 INSERT INTO x (`f_a`, `f_b`) VALUES (13, 17);

其中 f_a 和 f_b 是外键?

4

1 回答 1

6

您可以使用 EntityManager 的getReference()方法获取“引用”实例,而不是使用 find() 加载实体。这些引用是延迟获取的,因此在您的情况下,根本不需要获取它们。

您的代码看起来类似:

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() 调用才能访问您的数据库。

于 2012-08-27T13:10:03.550 回答