`
as11051105
  • 浏览: 60046 次
  • 性别: Icon_minigender_1
  • 来自: 贵阳
社区版块
存档分类
最新评论

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);


看看,这样是不是要快很多呢?
分享到:
评论

相关推荐

    Hibernate——符合Java习惯的关系数据库持久化

    通过使用Hibernate,开发人员可以避免直接编写大量的SQL语句,而是使用面向对象的方式进行数据操作,这极大地提高了开发效率并降低了维护成本。 ### 1. ORM概念 ORM是Object-Relational Mapping的缩写,它是将对象...

    Hibernate使用——入门

    **Hibernate使用——入门** Hibernate 是一个强大的开源对象关系映射(ORM)框架,它简化了Java应用程序与数据库之间的交互。这篇博文将引导你入门Hibernate,理解其基本概念和使用方法。 **1. Hibernate概述** ...

    Hibernate 4——Hello World

    使用`Session`对象的`save()`或`saveOrUpdate()`方法来保存实体到数据库: ```java Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); User user = new User("John ...

    Hibernate总结——课程管理

    综上所述,通过使用Hibernate,我们可以方便地实现课程管理系统的多对多关联映射及CRUD操作,极大地提高了开发效率和代码质量。在学习和实践中,理解并熟练掌握这些知识点对于提升Java数据库应用开发能力至关重要。

    Hibernate使用——自定义数据类型

    例如,使用Lombok库可以简化getter和setter的编写,而使用Hibernate Tools可以自动生成实体类和映射文件,这在处理大量自定义类型时非常有用。 总的来说,自定义数据类型是Hibernate的一个强大特性,它使我们能够...

    Hibernate中大量数据的更新

    本文将讨论使用 Hibernate 批量更新大量数据的方法和技巧。 批量更新的必要性 在实际应用中,我们经常需要将大量数据插入到数据库中,例如数据迁移、数据同步、数据备份等场景。在这些场景中,如果使用传统的 ...

    Hibernate save persist merge探究

    本文将深入探讨Hibernate中的save、persist和merge这三个方法,帮助开发者更好地理解它们的用法和内在机制。 一、save()方法 save()是Hibernate早期版本中最常用的方法,用于将对象持久化到数据库中。当调用Session...

    模拟hibernate的session.save()功能

    首先,`session.save()`是Hibernate中的一个关键方法,用于将一个新的或已更新的对象状态保存到数据库中。在模拟这个功能时,我们需要关注以下几点: 1. **对象状态管理**:在Hibernate中,对象有三种状态:瞬时态...

    hibernate 的saveOrUpdate

    Hibernate是Java领域中一款流行的持久化框架,它简化了数据库操作,使得开发人员可以更加专注于业务逻辑而不是数据存储的细节。...了解并熟练掌握它的原理和使用场景,对于提升Hibernate应用的效率和质量至关重要。

    提升Hibernate性能的魔方——IronTrack SQL.pdf

    当开发者初次接触Hibernate时,他们通常会寻找方法来监控Hibernate自动生成的SQL语句。在Hibernate提供的基本SQL监控功能之外,更专业的需求可以通过安装额外的监控工具来实现,例如IronTrack SQL。该工具不仅可以...

    安卓Android源码——Hibernate4.zip

    【标题】"安卓Android源码——Hibernate4.zip" 提供的是关于在Android平台上使用Hibernate4框架的源代码示例。Hibernate4是一个流行的Java对象关系映射(ORM)工具,它允许开发者将数据库操作与Java对象模型相结合,...

    hibernate效率问题

    hibernate效率注意的几个问题,批量删除和批量更新建议用JDBC,这是一个原则,当然有的时候可能必须用Hibernate来批量更新和批量删除,那么这个时候我想说的就是,Hibernate批量更新和删除效率并非传说中的那么差,...

    7.1.1Hibernate的入门必备——文档和源码

    【标题】"7.1.1Hibernate的入门必备——文档和源码"主要涉及的是Java领域的一个重要ORM框架——Hibernate的基础学习。Hibernate是一种用于Java应用的开源对象关系映射(ORM)工具,它允许开发者将Java类与数据库表...

    struts2+hibernate整合例子——新闻管理系统

    总结来说,"struts2+hibernate整合例子——新闻管理系统"是一个典型的Java Web应用示例,展示了如何利用Struts2的MVC模式和Hibernate的ORM能力,实现对新闻数据的CRUD操作及高级查询。这个系统可能包含了Action类、...

    struts2+hibernate整合的例子——新闻管理系统

    Hibernate提供了Session接口,用于执行CRUD操作,例如,`save()`、`update()`、`delete()`和`load()`等方法。此外,为了实现模糊查找功能,可能使用了HQL(Hibernate Query Language)或者SQL的LIKE语句,结合标题和...

    Hibernate SQLQuery 查询Oracle char类型结果为一个字符解决方法

    ### Hibernate SQLQuery 查询Oracle char类型结果为一个字符的解决方法 在使用Hibernate框架结合Oracle数据库进行数据查询时,经常会遇到一个问题:当查询的结果集中包含char类型的字段时,Hibernate可能会将其映射...

Global site tag (gtag.js) - Google Analytics