在用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);
看看,这样是不是要快很多呢?
分享到:
相关推荐
Hibernate——符合Java习惯的关系数据库持久化.pdf
Hibernate 4——Hello World
简单的Hibernate实现Java通过多对多关联映射,进行学生课程管理。
学习JPA——Hibernate_Annotation使用实例学习JPA——Hibernate_Annotation使用实例学习JPA——Hibernate_Annotation使用实例
使用Hibernate将大量记录插入到数据库
NULL 博文链接:https://gwoham-163-com.iteye.com/blog/1895101
安卓Android源码——Hibernate4.zip
NULL 博文链接:https://gwoham-163-com.iteye.com/blog/1885253
hibernate效率注意的几个问题,批量删除和批量更新建议用JDBC,这是一个原则,当然有的时候可能必须用Hibernate来批量更新和批量删除,那么这个时候我想说的就是,Hibernate批量更新和删除效率并非传说中的那么差,...
Hibernate SQLQuery 查询Oracle char类型结果为一个字符解决方法 Hibernate SQLQuery 查询Oracle char类型结果为一个字符解决方法 Hibernate SQLQuery 查询Oracle char类型结果为一个字符解决方法 Hibernate SQL...
这个资源对应的是我的博客里头的hibernate模拟程序的源码
Hibernate提供的查询接口或其方法 hibernate综合查询解决方案
7.1.1Hibernate的入门必备——文档和源码 视频看我的主页共享地方
hibernate+mysql 中文存入数据库乱码解决方法
Java开发利器——Hibernate 开发及整合应用大全.zip.004
精通Eclipse整合Web开发——Struts,Spring,Hibernate,JBPM 图书馆下载的,不是很清晰,如果介意的,请不要下载,不要拍砖。 总共有三部分。
Hibernate多表关联配置及错误解决方法,及时更新,相关信息待下回分解!