有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

具有多个多个关系的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) 个答案

  1. # 1 楼答案

    看起来您只保存了MainEntity(我假设添加到集合中的EntityA、B是新的实体)

    在我看来,您应该至少在每个单向关系中添加此级联选项:

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

    否则,您应该在EntityAEntityB的每个节点上调用save