0 0

Hibernate OneToMany中批量插入的问题5

        先描述下问题:在做Hibernate的OneToMany关联时,Hibernate不会进行批量插入,而是根据Set中的记录数做了N次插入。能否有办法做到批量插入?希望各位大侠给分析下,谢谢!  用到的代码如下:



一端的Bean如下:
@Entity
@Table(name = "a_temp_one")
public class OneSide {
	@Column(name="id")
	@Id
	@GeneratedValue(generator="hibernate-uuid")
	@GenericGenerator(name = "hibernate-uuid", strategy = "uuid")
	private String id = null;
	
	@Column(name="name")
	private String name = null;

	@OneToMany(cascade={},fetch = FetchType.LAZY)
	@JoinTable(name = "a_temp_onetomany", joinColumns = { @JoinColumn(name = "ONEID") },
                                          inverseJoinColumns = { @JoinColumn(name = "MANYID") })
	private Set<ManySide> manySet = null;

    /**
	 * Getter 和 Setter 方法省略
	 */

}

多端的Bean如下:
@Entity
@Table(name = "a_temp_many")
public class ManySide {

	@Column(name="id")
	@Id
	@GeneratedValue(generator="hibernate-uuid")
	@GenericGenerator(name = "hibernate-uuid", strategy = "uuid")
	private String id = null;
	
	@Column(name="name")
	private String name = null;
	/**
	 * Getter 和 Setter 方法省略
	 */
}


TestCase中的代码如下:
public class Test extends TestCase{

	protected Session session;
	protected Transaction tx;

	protected void setUp() throws Exception {
		Configuration cfg = new AnnotationConfiguration().configure();
		session = cfg.buildSessionFactory().openSession();
		tx = session.beginTransaction();
	}

	protected void tearDown() throws Exception {
		tx.commit();
		session.close();
	}

	public void test() {
		OneSide one = (OneSide) session.load(OneSide.class,"4028b2923782ae44013782ae47480000");
		String hql = "From ManySide";
		// 查询所有的Many端对象
		List<ManySide> list = session.createQuery(hql).list();
		// 设置多端到一端并更新
		one.setManySet(new HashSet<ManySide>(list));
		session.update(one);
	}
}


执行后Hibernate生成的代码如下:

Hibernate: select manyside0_.id as id1_, manyside0_.name as name1_ from a_temp_many manyside0_
Hibernate: select oneside0_.id as id0_0_, oneside0_.name as name0_0_ from a_temp_one oneside0_ where oneside0_.id=?
Hibernate: delete from a_temp_onetomany where ONEID=?
Hibernate: insert into a_temp_onetomany (ONEID, MANYID) values (?, ?)
Hibernate: insert into a_temp_onetomany (ONEID, MANYID) values (?, ?)
Hibernate: insert into a_temp_onetomany (ONEID, MANYID) values (?, ?)
Hibernate: insert into a_temp_onetomany (ONEID, MANYID) values (?, ?)



可以看出Hibernate是给关联表做了多次插入去维护一方和多方的关系,这样的话,当数据量上来的时候,一定会影响效率。所以请问有没有办法能把上面的几个Sql做一个批量插入去维护关联表?
2012年5月25日 16:28
目前还没有答案

相关推荐

    Hibernate 中文参考文档

    为了提高性能,Hibernate提供了批量插入、更新和删除功能,以及延迟加载、批处理等优化策略。合理使用这些特性可以显著提升应用性能。 综上所述,Hibernate中文参考文档详尽地阐述了如何使用Hibernate进行数据持久...

    hibernate(一对多,多对一映射)操作

    在Hibernate中,我们通常使用`@OneToMany`注解来表示这种关系。例如,一个学生可以有多个课程,而一门课程可以被多个学生选修。为了实现这种关系,我们需要在父实体类中定义一个集合属性,如`List&lt;Course&gt;`,并使用...

    Hibernate插入数据

    10. **批量插入**:对于大量数据插入,可使用SQL的批处理或Hibernate的批处理功能,如Session的batch_size配置,提高性能。 在实际开发中,我们还需要注意一些优化技巧,比如懒加载(@OneToMany、@ManyToOne等关系...

    hibernate 中文文档 and _annotation.chm

    - 使用批处理:通过设置hibernate.jdbc.batch_size来批量处理插入、更新和删除操作。 - 开启二级缓存:提高数据读取速度,但需注意缓存一致性问题。 - 使用懒加载(Lazy Loading):按需加载关联对象,减少内存...

    Hibernate框架jia包

    Hibernate通过`&lt;class&gt;`标签(XML映射)或@Entity注解(注解映射)定义实体类,`&lt;id&gt;`表示主键,`&lt;property&gt;`或@Basic对应字段,`&lt;many-to-one&gt;`或@ManyToOne处理一对多关系,`&lt;one-to-many&gt;`或@OneToMany处理多对...

    MLDN_Hibernate开发实战讲解视频教程

    9. 批量操作:为了提高性能,Hibernate支持批量插入、更新和删除,以及批处理查询。 10. JPA集成:Hibernate也实现了Java Persistence API(JPA),提供了一种标准的方式来使用ORM服务。 通过"MLDN_Hibernate开发...

    hibernate开发包

    8. 批量操作:Hibernate支持批量插入、更新和删除,可以显著提高性能,例如`StatelessSession`用于执行此类操作。 9. JPA兼容性:Hibernate既是独立的ORM框架,也实现了Java Persistence API(JPA),因此具备跨...

    Manning - Java Persistence With Hibernate.pdf

    8. 批量处理和性能优化:Hibernate提供了批量插入、更新和删除操作,以及批处理查询。此外,通过合理的配置和设计,如合理选择缓存策略、避免N+1查询问题、优化HQL语句,可以显著提升性能。 9. JPA与Hibernate:...

    hibernate中文帮助文档

    Hibernate支持一对一(OneToOne)、一对多(OneToMany)、多对一(ManyToOne)和多对多(ManyToMany)的关联映射,通过外键或者中间表实现关系。 八、性能优化 1. 批量操作:利用批处理提高插入、更新和删除的效率...

    hibernate立体结构文档

    Hibernate是Java开发中的一个持久化框架,它通过提供一种对象-关系映射机制,将Java类与数据库表之间的关系进行映射,实现了在数据库操作中以面向对象的方式处理数据。它具有强大的查询语言HQL(Hibernate Query ...

    hibernate性能优化.doc

    在 Hibernate 中,如果我们需要批量处理大量数据,例如插入 1000 000 条记录,就会出现 OutOfMemoryException 异常。这是因为 Hibernate 的 Session 有一个一级缓存,会将所有对象存储在内存中。如果不及时清空缓存...

    Hibernate课程的总结

    **标题:“Hibernate课程的总结”** 在学习Hibernate框架的过程中,我们深入探讨了它在Java企业级应用中的...通过阅读提供的“hibernate课堂笔录_0906.txt”,可以进一步巩固这些知识,并解决实际开发中遇到的问题。

    hibernate中文文档

    7. **批量处理**:Hibernate提供了批处理功能,如批处理更新和删除,以及SQL插入语句的批量执行。通过设置批处理大小,可以提高数据库操作的效率。 8. **对象事件**:Hibernate允许监听对象的生命周期事件,如加载...

    hibernate学习总结

    - 使用`batch-size`设置批量插入、更新的大小。 - `flushMode`控制何时与数据库同步数据。 - `hibernate.show_sql`开启SQL日志,便于调试。 ### 9. Criteria与Querydsl结合 Querydsl 是一个强大的查询构造工具,...

    hibernate list集合映射

    2. **批量操作**:使用批处理更新和插入,提高数据处理效率。 3. **懒加载与立即加载**:根据需求选择合适的加载策略,避免不必要的数据加载。 **五、注意事项** 1. **索引维护**:当元素在List中移动时,需要...

    Hibernate帮助文档合集

    2. batch size:设置批量插入、更新或删除的大小,提升数据库操作效率。 九、事件监听和拦截器 1. 事件监听器:通过实现特定接口,对持久化操作进行预处理和后处理。 2. 拦截器:更灵活的扩展机制,可以在对象生命...

    培训机构hibernate资料ppt

    3. 批量操作与性能优化:学习如何进行批量插入、更新,以及如何通过配置和策略提升Hibernate的性能。 4. 组合实体与懒加载:讲解如何处理复杂对象结构,理解和使用懒加载以降低内存消耗。 通过这四次课程的学习,...

    Hibernate中文参考文档V3.2(HTML)

    - 批量操作:使用批处理更新和插入,减少与数据库的交互次数。 - lazy loading:延迟加载,只在需要时加载关联对象,减少内存占用。 - 查询优化:合理使用HQL和Criteria,避免N+1查询问题,使用JOIN fetch提高性能。...

    Hibernate框架搭建及数据库相关操作

    在这个教程中,我们将逐步介绍如何搭建 Hibernate 框架,并进行基本的数据库操作。 **一、Hibernate 概述** Hibernate 提供了一个强大的数据持久化层,允许开发者使用面向对象的方式来处理数据库事务,而无需直接...

Global site tag (gtag.js) - Google Analytics