2011-12-21 51 views
1

我必须做批量插入,并需要添加内容的ID。这是一个基本的例子,显示了我在做什么(这对性能来说显然是很糟糕的)。我正在寻找更好的方法来做到这一点。通过弹簧/休眠批量插入其中需要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); 
     } 
    } 
} 

在上述持续的情况下是在内部调用

sessionFactory.getCurrentSession().saveOrUpdate(); 

有取回的ID,并且基于该散装插入的任何优化的方式的方法?

谢谢!

更新:得到了它与下面的添加工作,并帮助从JustinKSU

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

//而对于其他类和需要被保留

回答

2

如果使用注释定义关系并定义适当的级联,则应该能够在java中的对象中设置对象关系,并将其全部保存在一个调用中。休眠会为你设置外键。

文档 - http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html/entity.html#entity-mapping-association

父对象的一个​​例子注释是

@OneToMany(mappedBy = "foo", fetch = FetchType.LAZY, cascade=CascadeType.ALL) 

在子对象,你会做以下

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

你有这样的例子吗?我不确定您的注释和适当的级联是什么意思。 – user973479 2011-12-21 17:38:56

+0

如果我只是试图坚持objFour(理论上会坚持一切),我得到的错误“org.hibernate.PropertyValueException:非空属性引用空值或瞬态值” – user973479 2011-12-21 18:52:05

+0

您使用XML或注解来配置Hibernate? – JustinKSU 2011-12-21 18:58:09

0

假设你只是看着自己的对象相似一次性获取大量数据并且问题在于,由于各种相关对象被持久化,因此您不知道ID将会变成什么样,一种可能的解决方案是运行所有插入(作为批量插入)添加到临时ID(和一些会话ID)的辅助表(每个实际表一个表)中,并具有存储过程p在解析ID的同时将插入操作变为真正的表格。

1

我不知道,但Hibernate进行批量插入/更新。我明白的问题是你需要坚持父对象,以便将引用分配给子对象。

我会尝试坚持所有的“一个”对象。然后,遍历所有他们的“三个”对象,并在第二次批量插入中坚持它们。

如果您的树有三个级别,您可以实现3批次的所有插入。我觉得很体面。