`
chinrui
  • 浏览: 98025 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

Hibernate 里面的1+N问题

阅读更多
Hibernate之1+N问题

1、 Category类
package com.edu.hpu;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Category {

	private int id;
	private String name;
	
	@Id
	@GeneratedValue
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}

2、 Topic类
package com.edu.hpu;

import java.util.Date;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;

@Entity
public class Topic {

	private int id;
	private String title;
	private Date date;
	private Category category;
	
	@Id
	@GeneratedValue
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public Date getDate() {
		return date;
	}
	public void setDate(Date date) {
		this.date = date;
	}
	
	@ManyToOne
	@JoinColumn(name="category_ID")
	public Category getCategory() {
		return category;
	}
	public void setCategory(Category category) {
		this.category = category;
	}
}

3、 测试类
package com.edu.hpu;

import java.util.Date;
import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import org.hibernate.tool.hbm2ddl.SchemaExport;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;

public class TestClass {

	private static SessionFactory sf = null;
	
	@BeforeClass
	public static void beforeClass() {
		Configuration conf = new Configuration().configure();
		ServiceRegistry sr = new ServiceRegistryBuilder().applySettings(conf.getProperties()).buildServiceRegistry();
		sf = conf.buildSessionFactory(sr);
	}
	
	@Test
	public void testExport() {
		new SchemaExport(new Configuration().configure()).create(true ,true);
	}
	
	@Test
	public void testSave() {
		Session session = sf.openSession();
		session.beginTransaction();
		
		for(int i = 0; i < 10; i++) {
			Category c = new Category();
			c.setName("c" + i);
			Topic t = new Topic();
			t.setTitle("t" + i);
			t.setDate(new Date());
			t.setCategory(c);
			session.save(c);
			session.save(t);
		}
		
		session.getTransaction().commit();
		session.close();
	}
	
	@Test
	public void testQL_1() {
		Session s = sf.getCurrentSession();
		s.beginTransaction();
		List<Topic> ts = (List<Topic>)s.createQuery("from Topic").list();
		for(Topic t : ts) {
			System.out.println(t.getId() + " " + t.getTitle());
			//System.out.println(t.getCategory().getId() + t.getCategory().getName());
		}
		s.getTransaction().commit();
	}
	
	@AfterClass
	public static void afterClass() {
		sf.close();
	}
}

由于Category的FetchType是EAGER,每当要取一个Topic的时候就会取出相应的Category会发出与Topic数目相等的SQL语句,影响执行速度。
4、 解决方法
  • 第一种:将Topic的FetchType调成LAZY,每当要用到一个的时候就发出一条SQL语句
  • 第二种:在Category类上添加注解@BatchSize(size=5),一次性取出5条Category记录
  • 第三种:使用join fetch

@Test
public void testQL_2() {
	Session s = sf.getCurrentSession();
	s.beginTransaction();
	List<Topic> ts = (List<Topic>)s.createQuery("from Topic t left outer join fetch t.category c").list();
	for(Topic t : ts) {
		System.out.println(t.getId() + " " + t.getTitle());
	}
	s.getTransaction().commit();
}


分享到:
评论

相关推荐

    hibernate API帮助文档 及hibernate学习笔记

    - 笔记可能涵盖了实际开发中遇到的问题、解决方案、性能优化技巧以及最佳实践,如批处理操作、避免N+1查询等。 - 可能会包含对复杂关联关系的处理,如多对一、一对多、多对多关系的映射。 - 可能涉及到Hibernate...

    maven3.0+struts+spring+hibernate

    1.STRUTS2乱码,解决方法是在struts.xml中加入 &lt;constant name="struts.i18n.encoding" value="gb2312" /&gt; 2.验证失败一次后就连续验证失败 (即使密码正确) 这个属于与Spring整合的问题,Spring容器在初始化对象的...

    精通Hibernate:Java对象持久化技术详解(第2版)源代码

    (本人另一个上传资源里面也有 精通HibernateJava对象持久化技术详解(第2版)jar文件.zip) annotations-api.jar antlr-2.7.6.jar catalina-ant.jar catalina-ha.jar catalina-tribes.jar catalina.jar commons-...

    一个简单的主从表的增删改 采用struts+hibernate

    网上有关主从表提交的资料...用了以下包 dom4j,hibernate3,struts1.2,junit,几个常用apache-commons包,cglib,ehcache,mysql-connector,附件代码里面没有把这些库打包,如果要运行请自己网上下载吧,反正都是开源的

    struts和hibernate实现的jsp分页里面有分页工具

    1. **数据库查询**:使用Hibernate的Criteria或HQL(Hibernate Query Language)进行分页查询。你需要指定开始位置(当前页数乘以每页条目数)和结束位置(开始位置加上每页条目数),以获取正确的数据子集。 2. **...

    Hibernate关系映射

    这是本人参照Hibernate官方文档,将里面的关系映射(1-1、N-1、1-N、N-N)全部做了一遍,包括Junit单元测试,读者只需要修改hibernate.cfg.xml中的资源路径和数据库配置就可以正确运行此程序,祝学习愉快。

    Struts2 Spring hibernate 国际化 表单验证 安全退出

    这次弄了点细节问题 所以分要的高了点 不过应该还是值得的 汗 登录做得太笨了 原来可以这样做 更改hibernate的实现类 添加以下方法 ,loginaction的条件用这个来改 public boolean login(String username, String ...

    Web开发+java+ssh框架

    1、内存消耗:采用JDBC的架构2无疑是最省内存的,Hibernate的架构3次之,EB的架构1最差。 2、运行效率:如果JDBC的代码写的非常优化,那么JDBC架构运行效率最高,但是实际项目中,这一点几乎做不到,这需要程序员...

    Algonquin:算法 'N' 查询里面

    本文将深入探讨"Algonquin:算法 'N' 查询里面"这个项目,它是一个使用Java编程语言实现的面向对象数据库类项目。我们将详细讨论Java语言的基础,面向对象编程的概念,以及在数据库交互中的查询技术。 首先,Java是...

    整理后java开发全套达内学习笔记(含练习)

    补码= 反码 +1 正数=负数的补码(反码+1) 反码= 非(二进制数) 八进制数,零开头 011(八进制)=9(十进制) 十六进制数,零x开头 0x55(十六进制)=5*16+5(十进制) 类型:数据都必须有类型 boolean (8bit,不定...

    IntelliJ IDEA入门图文教程整理

    1. **安装与启动**: 在官方网站下载适合你操作系统的版本,然后按照安装向导进行安装。安装完成后,启动IntelliJ IDEA,首次打开时会提示创建新项目或导入现有项目。 2. **创建新项目**: 在欢迎屏幕上选择...

    最新Java面试宝典pdf版

    2. 用table显示n条记录,每3行换一次颜色,即1,2,3用红色字体,4,5,6用绿色字体,7,8,9用红颜色字体。 83 3、HTML 的 form 提交之前如何验证数值文本框的内容全部为数字? 否则的话提示用户并终止提交? 84 4、...

    java面试宝典2012

    2. 用table显示n条记录,每3行换一次颜色,即1,2,3用红色字体,4,5,6用绿色字体,7,8,9用红颜色字体。 90 3、HTML 的 form 提交之前如何验证数值文本框的内容全部为数字? 否则的话提示用户并终止提交? 91 4、...

    JAVA面试宝典2010

    2. 用table显示n条记录,每3行换一次颜色,即1,2,3用红色字体,4,5,6用绿色字体,7,8,9用红颜色字体。 83 3、HTML 的 form 提交之前如何验证数值文本框的内容全部为数字? 否则的话提示用户并终止提交? 84 4、...

    Java面试宝典-经典

    2. 用table显示n条记录,每3行换一次颜色,即1,2,3用红色字体,4,5,6用绿色字体,7,8,9用红颜色字体。 83 3、HTML 的 form 提交之前如何验证数值文本框的内容全部为数字? 否则的话提示用户并终止提交? 84 4、...

    java面试题大全(2012版)

    2. 用table显示n条记录,每3行换一次颜色,即1,2,3用红色字体,4,5,6用绿色字体,7,8,9用红颜色字体。 83 3、HTML 的 form 提交之前如何验证数值文本框的内容全部为数字? 否则的话提示用户并终止提交? 84 4、...

    Java面试宝典2012版

    2. 用table显示n条记录,每3行换一次颜色,即1,2,3用红色字体,4,5,6用绿色字体,7,8,9用红颜色字体。 83 3、HTML 的 form 提交之前如何验证数值文本框的内容全部为数字? 否则的话提示用户并终止提交? 84 4...

    Java面试宝典2012新版

    2. 用table显示n条记录,每3行换一次颜色,即1,2,3用红色字体,4,5,6用绿色字体,7,8,9用红颜色字体。 83 3、HTML 的 form 提交之前如何验证数值文本框的内容全部为数字? 否则的话提示用户并终止提交? 84 4、...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    (1)针对多窗口类浏览器模式问题,指出并分析了该问题存在的原因,利用Activity的运行机制,通过Fragment栈对主要模块的Webview进行管理,实现对不同模块之间切换的控制。 (2)针对跨域数据交互问题,指出并分析了...

    job4j_hql

    6. **查询优化**:学习如何优化HQL查询,避免N+1查询问题,以及如何使用Criteria API或HQL的子查询提高性能。 7. **关联映射**:理解不同类型的关联映射(一对一、一对多、多对一、多对多),以及如何在HQL中处理...

Global site tag (gtag.js) - Google Analytics