【发布时间】:2017-06-15 15:44:15
【问题描述】:
我已成功配置 Hibernate 以使用批处理查询来创建/更新对象,但有一个场景还不能正常工作。
我有 3 个实体: - 主要实体 - 实体 A - 实体 B
主实体与实体 A 和实体 B 都具有多对多关系。主实体是关系的所有者:
@ManyToMany
@JoinTable(name = "MAIN_A", joinColumns = {
@JoinColumn(name = "MAIN_UID", nullable = false, updatable = false) }, inverseJoinColumns = {
@JoinColumn(name = "A_UID", nullable = false, updatable = false) })
private Set<EntityA> entitiesA = new HashSet<>(0);
@ManyToMany
@JoinTable(name = "MAIN_B", joinColumns = {
@JoinColumn(name = "MAIN_UID", nullable = false, updatable = false) }, inverseJoinColumns = {
@JoinColumn(name = "B_UID", nullable = false, updatable = false) })
private Set<EntityB> entitiesB = new HashSet<>(0);
我写了一个3个简单的测试。 首先,我在数据库中创建了一些实体 A 和实体 B 行(这与所有 2 个测试用例相同)。
第一种情况: 创建 n 个主要实体,并为每个集合仅创建实体 A
结果:所有 Main Entity 和 MAIN_A 表条目只插入一个。所以在这种情况下,浴缸插入按预期工作。
第二种情况: 创建 n 个主要实体,并为每个集合仅创建实体 B
结果:所有 Main Entity 和 MAIN_B 表条目只插入一个。所以在这种情况下,浴缸插入按预期工作。
第三种情况: 创建 n 个主实体,并为每个集合创建实体 A 和实体 B
结果:所有主实体只插入一次,n 插入 MAIN A 和 MAIN_B 表条目。在这种情况下,批量插入不起作用。我用谷歌搜索并搜索,但找不到答案。
有谁知道为什么它在第三种情况下没有按预期工作?我做错什么了吗?配置中有什么可以满足我的要求吗?
3 个场景的代码非常简单:
Set<EntityA> setA;
Set<EntityB> setB;
for (long i = 1; i < n; i++) {
MainEntity e = new MainEntity();
ac.setEntitiesA(setA); //this is commented in the second scenario
ac.setEntitiesB(setB); // this is commented in the first scenario
session.save(e);
}
我在hibernate论坛发了同样的问题:Hibernate Forum post
【问题讨论】:
-
你能添加用于执行第 3 个场景的代码吗?
-
@MaciejKowalski 我刚刚用代码更新了问题
标签: java sql hibernate many-to-many query-performance