scr*_*avy 5 java mysql jpa foreign-keys
我有一个应用程序创建了许多引用其他两个实体的行,即行中有两个实现ManyToOne关系的外键引用.
这些是被引用的两个实体:
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)
)
Run Code Online (Sandbox Code Playgroud)
这是引用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`),
)
Run Code Online (Sandbox Code Playgroud)
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);
Run Code Online (Sandbox Code Playgroud)
事情是我必须插入大约200,000个实体,这是非常多的.分别是As和Bs的3倍左右,所以我必须获得A和B的200,000倍,最有可能是200,000个不同的A和B,因此我无法用缓存做多少.
我的问题是:是否真的有必要获取整个实体?有没有办法降低这些成本?或者是否有某种方法可以手动设置外键引用(归结为整数)而不会失去JPA的好处(即不必编写我自己的查询)?
问题的另一种表述:如何使用JPA完成以下操作?
INSERT INTO x (`f_a`, `f_b`) VALUES (13, 17);
Run Code Online (Sandbox Code Playgroud)
其中f_a和f_b是外键?
您可以使用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);
Run Code Online (Sandbox Code Playgroud)
但只有persist()调用才能访问您的数据库.
| 归档时间: |
|
| 查看次数: |
191 次 |
| 最近记录: |