具有多个多个关系的java Hibernate批处理事务
我成功地将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
结果:所有主实体和主表条目仅插入一次。因此,在这种情况下,镀液插入按预期工作
第二种情况: 创建n个主实体,每个集合仅创建实体B
结果:对所有主实体和主表条目只插入一次。因此,在这种情况下,镀液插入按预期工作
第三种情况: 创建n个主实体,并为每个集合创建实体A和实体B
结果:所有主实体只插入一个,主A和主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
# 1 楼答案
看起来您只保存了
MainEntity
(我假设添加到集合中的EntityA、B是新的实体)在我看来,您应该至少在每个单向关系中添加此级联选项:
否则,您应该在
EntityA
、EntityB
的每个节点上调用save