Hibernate——大量save()效率低下的解决方法

在用Hibarnate进行大量数据save时,速度会变得很慢,先举个例子如下:

主表-订单:order.hbm.xml

<set name="grnEntries" inverse="false" lazy="false" order-by="ID asc" cascade="all">
<key>
<column name="GO_ENTRY_ID" />
</key>
<one-to-many class="com.lx100ERP.model.GrnEntries" />
</set>


子表-订单分录:entry.hbm.xml

<many-to-one name="godownEntry" class="com.lx100ERP.model.GodownEntry"
cascade="all" outer-join="false" update="false" insert="false" fetch="select"
column="GO_ENTRY_ID" not-null="false">
</many-to-one>


通过查看Hibernate在执行save操作的sql,发现执行步骤如下:
1、 先把数据插入主表:

insert into order values(...);

2、 再把数据插入子表

insert into entry values(...);
insert into entry values(...);
……

3、 最后再把主表的ID插入到子表里:

update entry set order_id = order.id where ...;
update entry set order_id = order.id where ...;
……

这样做在entry表数据很多的情况下,非常耗时,效率低。

找到了原因,就来看看怎么解决,我们进行手动配置主外键关系维护就行了,就在hibernate配置文件里把inverse改为"true"就行了。

步骤:
1、 修改order.hbm.xml配置信息

<set name="grnEntries" inverse="true" lazy="false" order-by="ID asc" cascade="all">
<key>
<column name="GO_ENTRY_ID" />
</key>
<one-to-many class="com.lx100ERP.model.GrnEntries" />
</set>


2、 修改entry.hbm.xml配置信息

<many-to-one name="godownEntry" class="com.lx100ERP.model.GodownEntry"
cascade="all" outer-join="false" update="false" insert="true" fetch="select"
column="GO_ENTRY_ID" not-null="false">
</many-to-one>


3、 代码实现时

IemiTemp iemiTemp = new IemiTemp();
Set<IemiTempEntry> set = new HashSet<IemiTempEntry>();
for (String s : str) {
String[] arr = s.trim().split(",");
for (String temp : arr) {
IemiTempEntry entry = new IemiTempEntry();
temp = temp.trim();
if (temp == null || "".equals(temp)) {
continue;
}
entry.setIemi(temp);
//inverse="true" 手动配置主外键关系维护
entry.setIemiTemp(iemiTemp);
iemiTemp.getIemiTempEntrys().add(entry);
set.add(entry);
}
}


4、设置后,直接保存order即可

iemiTempService.save(iemiTemp);


看看,这样是不是要快很多呢?
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值