2017-06-15 80 views
2

我成功配置Hibernate以使用批量查询来创建/更新对象,但是有一种情况尚未运行。有多个ManyToMany关系的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个测试用例共同)。

第一种情形:为所有的主要实体和MAIN_A表条目只有一个插件: 创建n个主要实体和每个只有实体A

结果设置。所以在这种情况下浴槽插入工作正常。

第二种情况: 创建n个主要实体和每个只设置实体B

结果:只有一个插入的主要实体和MAIN_B表中的所有条目。所以在这种情况下浴槽插入工作正常。

第三种情况: 创建n个主要实体并为每个都设置实体A和实体B

结果:只有一个插入的所有主要实体和ñ插入两个MAIN A和MAIN_B表条目。在这种情况下批量插入不起作用。我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); 
} 

我张贴在休眠论坛相同qestion:Hibernate Forum post

+0

您可以添加用于执行第三种情况的代码吗? –

+0

@MaciejKowalski我刚刚更新了代码 – Simone

回答

0

看来你只能保存MainEntity(我假设添加到集合中的EntityA,B是新的实体)。

在我看来,你应该至少在这个级联选项添加到您的每一个单向的关系:

@ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}) 

否则,你应该调用保存在每个EntityA的,EntityB

+0

的问题EntityA和EntityB被保存之前......我观察到的是关系表中的更新没有在第三种情况下使用批量插入 – Simone

+0

我仍然试图改变级联类型但它没有任何区别... 我的问题不在于在数据库中创建EntityA和EntityB。 我的问题是关于Hibernate如何在关系表Main_A和Main_B中插入数据......在第三种情况下,批处理插入未使用,Hibernate执行300次插入查询而不是1.在方案1和2中不会发生这种情况我还没有找到解释! – Simone