具有多个ManyToMany关系的Hibernate批处理事务

时间:2017-06-15 15:44:15

标签: java sql hibernate many-to-many query-performance

我成功配置了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

1 个答案:

答案 0 :(得分:0)

您似乎只保存MainEntity(我假设EntityA,B添加到集合中是新实体)。

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

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

否则,您应该调用每个EntityAEntityB

上的保存