我成功配置了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_A表条目只能插入一个。因此,在这种情况下,浴槽插入工作正常。
第二种情况: 创建n主实体,并为每个集仅创建实体B
结果:所有主要实体和MAIN_B表条目只有一个插入。因此,在这种情况下,浴槽插入工作正常。
第三种情况: 创建n主实体,并为每个集创建实体A和实体B
结果:MAIN A和MAIN_B表条目的所有主要实体和 n 插入只有一个插入。在这种情况下,批量插入不起作用。我用Google搜索并搜索但我找不到答案。
有谁知道为什么它在第三种情况下没有按预期工作?我做错了吗?配置中是否有任何符合我要求的内容?
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
答案 0 :(得分:0)
您似乎只保存MainEntity
(我假设EntityA,B添加到集合中是新实体)。
在我看来,你应该为每个单向关系添加至少这个级联选项:
@ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
否则,您应该调用每个EntityA
,EntityB
。