Java 通过Spring/Hibernate在需要ID的地方进行批量插入

Java 通过Spring/Hibernate在需要ID的地方进行批量插入,java,hibernate,spring,insert,bulk,Java,Hibernate,Spring,Insert,Bulk,我必须进行批量插入,并且需要添加内容的ID。这是一个基本的例子,说明了我在做什么(这对性能来说显然是可怕的)。我正在寻找一个更好的方法来做到这一点 public void omgThisIsSlow(final Set<ObjectOne> objOneSet, final Set<ObjectTwo> objTwoSet) { for (final ObjectOne objOne : objOneSet) {

我必须进行批量插入,并且需要添加内容的ID。这是一个基本的例子,说明了我在做什么(这对性能来说显然是可怕的)。我正在寻找一个更好的方法来做到这一点

public void omgThisIsSlow(final Set<ObjectOne> objOneSet,
                          final Set<ObjectTwo> objTwoSet) {
    for (final ObjectOne objOne : objOneSet) {
        persist(objOne);
        for (final ObjThree objThree : objOne.getObjThreeSet()) {
            objThree.setObjOne(objOne);
            persist(objThree);
        }
        for (final ObjectTwo objTwo : objTwoSet) {
            final ObjectTwo objTwoCopy = new ObjTwo();
            objTwoCopy.setFoo(objTwo.getFoo());                
            objTwoCopy.setBar(objTwo.getBar());
            persist(objTwoCopy);

            final ObjectFour objFour = new ObjectFour();
            objFour.setObjOne(objOne);
            objFour.setObjTwo(objTwoCopy);
            persist(objFour);
        }
    }
}
是否有任何优化的方法可以取回ID并在此基础上进行批量插入

谢谢

更新:通过以下添加和来自JustinKSU的帮助使其正常工作

import javax.persistence.*;
@Entity
public class ObjectFour{
  @ManyToOne(cascade = CascadeType.ALL)
  private ObjectOne objOne;
  @ManyToOne(cascade = CascadeType.ALL)
  private ObjectTwo objTwo;
}

//与其他需要持久化的类及其对象类似

假设您只想一次性持久化大量数据,而您的问题是,在持久化各种相关对象时,您不知道ID将是什么,一种可能的解决方案是运行所有插入(作为批量插入)到具有临时ID(和一些会话ID)的辅助表中(每个实际表一个)并让存储过程在解析ID的同时执行对实际表的插入。

如果您使用注释定义关系并定义适当的级联,您应该能够在java中的对象中设置对象关系,并在一次调用中保持所有关系。Hibernate将为您处理外键的设置。

文件-

父对象上的注释示例如下

@OneToMany(mappedBy = "foo", fetch = FetchType.LAZY, cascade=CascadeType.ALL)
在子对象上,您将执行以下操作

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "COLUMN_NAME", nullable = false)

我不确定,但Hibernate会进行批量插入/更新。我理解的问题是,您需要持久化父对象,以便将引用分配给子对象

我将尝试持久化所有的“一”对象,然后迭代所有的“三”对象,并在第二次批量插入中持久化它们


如果你的树有三个级别,你可以在三个批中完成所有插入。我认为这相当不错。

你有这样一个例子吗?我不确定你所说的注释和适当的层叠是什么意思。如果我只是尝试持久化objFour(理论上可以持久化所有其他内容),我会得到错误“org.hibernate.PropertyValueException:not null属性引用null或瞬态值”您是否使用XML或批注来配置hibernate?我正在使用批注。我刚刚找到了答案,我想…(cascade=CascadeType.ALL)。我在这里找到了一个示例:
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "COLUMN_NAME", nullable = false)