目前我有一个看起来像这样的对象(还有其他成员变量):
public class Parent {
private Set<Child> children = new HashSet<Child>;
@OneToMany(cascade = { CascadeType.PERSIST,
CascadeType.MERGE }, fetch = FetchType.LAZY)
public Set<Child> getChildren() {
return children;
}
public setChildren(Set<Child> children) {
this.children = children;
}
}
然后,Child类还引用了它自己的子节点及其Parent对象。它的每个子节点都有一个引用它的拥有的Child对象。
我意识到这是很多循环引用,但在这一点上改变模型并不可行:(
对于持久性,我有以下内容:
private void persist(List<Parent> parents) {
synchronized(parentDAO) {
parentDao.startTx();
try {
for ( Parent parent : parents ) {
parentDao.merge( parent );
} catch (Exception e) {
parentDao.rollback();
}
parentDao.commit();
}
parentDao基本上只包含不同的实体管理器函数(即parentDao.startTx()获取调用EntityManager.getTransaction()。begin(),parentDao.merge()调用EntityManager.merge()等。
我正在尝试合并一个大小为11,000+的父级。合并需要7个多小时,我需要尽可能地减少它,因为我有大量的数据库操作需要在一夜之间运行,而这一次调用占用了我指定时间的大部分时间。 / p>
我有什么选择来加快这项行动?我知道通过分解设置为较小的集合来减少工作单元(我的同事一次建议100个Child对象)并且调用parentDao.merge(Set)是一个选项,但这实际上会加速整个操作吗?还有其他方法来加快这项行动吗?任何手动操作(如生成数据库转储和运行脚本)都是不可能的,因为此过程应该在一堆不同的环境中每周运行一次。
我们使用Oracle作为我们的数据库,我们使用的是Hibernate 3.6.6。
谢谢!