【发布时间】:2014-01-05 00:15:06
【问题描述】:
当您使用 JPARepository/Hibernate 保存对象时,它首先检查它是否存在(使用主键)在数据库中,然后插入。所以我们看到 2 个日志:SELECT & INSERT。
这就是我试图通过弹簧数据做的事情:(X 和 XY 是 2 个不同的对象)
Call Save on XRepository for Object X1
Call Save on XYRepository for Object X1Y1
Call Save on XYRepository for Object X1Y2
Call Save on XYRepository for Object X1Y3
Call Save on XRepository for Object X2
Call Save on XYRepository for Object X2Y1
Call Save on XYRepository for Object X2Y2
Call Save on XYRepository for Object X2Y3
这是我在日志中的观察结果:
SELECT X1
INSERT X1
SELECT X1Y1
SELECT X1Y2
SELECT X1Y3
INSERT X1Y1
INSERT X1Y2
INSERT X1Y3
SELECT X2
INSERT X2
SELECT X2Y1
SELECT X2Y2
SELECT X2Y3
INSERT X2Y1
INSERT X2Y2
INSERT X2Y3
那么 Spring Data 是什么时候真正调用插入的呢?这是如何工作的?
这是我所期望的:
SELECT X1
INSERT X1
SELECT X1Y1
INSERT X1Y1
SELECT X1Y2
INSERT X1Y2
SELECT X1Y3
INSERT X1Y3
...
【问题讨论】:
-
这些实体是如何映射的?他们是否使用生成的 ID?
-
X 有一个生成的 ID。第三个对象 Z 具有生成的 ID。 XY 有一个由 X 的 ID 和 Z 的 ID 组成的复合键。我刚刚测试并发现了另一个我想分享的有趣的东西:对于 XY,如果我删除复合主键(通过 IdClass)并添加第三个属性,即生成的 ID,它的行为符合我的预期(即一起获取选择/插入日志)
-
saveAndFlush 也使它按预期工作。嗯。
标签: java spring jpa spring-data spring-data-jpa