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();
}
分享到:
相关推荐
- 笔记可能涵盖了实际开发中遇到的问题、解决方案、性能优化技巧以及最佳实践,如批处理操作、避免N+1查询等。 - 可能会包含对复杂关联关系的处理,如多对一、一对多、多对多关系的映射。 - 可能涉及到Hibernate...
1.STRUTS2乱码,解决方法是在struts.xml中加入 <constant name="struts.i18n.encoding" value="gb2312" /> 2.验证失败一次后就连续验证失败 (即使密码正确) 这个属于与Spring整合的问题,Spring容器在初始化对象的...
(本人另一个上传资源里面也有 精通HibernateJava对象持久化技术详解(第2版)jar文件.zip) annotations-api.jar antlr-2.7.6.jar catalina-ant.jar catalina-ha.jar catalina-tribes.jar catalina.jar commons-...
网上有关主从表提交的资料...用了以下包 dom4j,hibernate3,struts1.2,junit,几个常用apache-commons包,cglib,ehcache,mysql-connector,附件代码里面没有把这些库打包,如果要运行请自己网上下载吧,反正都是开源的
1. **数据库查询**:使用Hibernate的Criteria或HQL(Hibernate Query Language)进行分页查询。你需要指定开始位置(当前页数乘以每页条目数)和结束位置(开始位置加上每页条目数),以获取正确的数据子集。 2. **...
这是本人参照Hibernate官方文档,将里面的关系映射(1-1、N-1、1-N、N-N)全部做了一遍,包括Junit单元测试,读者只需要修改hibernate.cfg.xml中的资源路径和数据库配置就可以正确运行此程序,祝学习愉快。
这次弄了点细节问题 所以分要的高了点 不过应该还是值得的 汗 登录做得太笨了 原来可以这样做 更改hibernate的实现类 添加以下方法 ,loginaction的条件用这个来改 public boolean login(String username, String ...
1、内存消耗:采用JDBC的架构2无疑是最省内存的,Hibernate的架构3次之,EB的架构1最差。 2、运行效率:如果JDBC的代码写的非常优化,那么JDBC架构运行效率最高,但是实际项目中,这一点几乎做不到,这需要程序员...
本文将深入探讨"Algonquin:算法 'N' 查询里面"这个项目,它是一个使用Java编程语言实现的面向对象数据库类项目。我们将详细讨论Java语言的基础,面向对象编程的概念,以及在数据库交互中的查询技术。 首先,Java是...
补码= 反码 +1 正数=负数的补码(反码+1) 反码= 非(二进制数) 八进制数,零开头 011(八进制)=9(十进制) 十六进制数,零x开头 0x55(十六进制)=5*16+5(十进制) 类型:数据都必须有类型 boolean (8bit,不定...
1. **安装与启动**: 在官方网站下载适合你操作系统的版本,然后按照安装向导进行安装。安装完成后,启动IntelliJ IDEA,首次打开时会提示创建新项目或导入现有项目。 2. **创建新项目**: 在欢迎屏幕上选择...
2. 用table显示n条记录,每3行换一次颜色,即1,2,3用红色字体,4,5,6用绿色字体,7,8,9用红颜色字体。 83 3、HTML 的 form 提交之前如何验证数值文本框的内容全部为数字? 否则的话提示用户并终止提交? 84 4、...
2. 用table显示n条记录,每3行换一次颜色,即1,2,3用红色字体,4,5,6用绿色字体,7,8,9用红颜色字体。 90 3、HTML 的 form 提交之前如何验证数值文本框的内容全部为数字? 否则的话提示用户并终止提交? 91 4、...
2. 用table显示n条记录,每3行换一次颜色,即1,2,3用红色字体,4,5,6用绿色字体,7,8,9用红颜色字体。 83 3、HTML 的 form 提交之前如何验证数值文本框的内容全部为数字? 否则的话提示用户并终止提交? 84 4、...
2. 用table显示n条记录,每3行换一次颜色,即1,2,3用红色字体,4,5,6用绿色字体,7,8,9用红颜色字体。 83 3、HTML 的 form 提交之前如何验证数值文本框的内容全部为数字? 否则的话提示用户并终止提交? 84 4、...
2. 用table显示n条记录,每3行换一次颜色,即1,2,3用红色字体,4,5,6用绿色字体,7,8,9用红颜色字体。 83 3、HTML 的 form 提交之前如何验证数值文本框的内容全部为数字? 否则的话提示用户并终止提交? 84 4、...
2. 用table显示n条记录,每3行换一次颜色,即1,2,3用红色字体,4,5,6用绿色字体,7,8,9用红颜色字体。 83 3、HTML 的 form 提交之前如何验证数值文本框的内容全部为数字? 否则的话提示用户并终止提交? 84 4...
2. 用table显示n条记录,每3行换一次颜色,即1,2,3用红色字体,4,5,6用绿色字体,7,8,9用红颜色字体。 83 3、HTML 的 form 提交之前如何验证数值文本框的内容全部为数字? 否则的话提示用户并终止提交? 84 4、...
(1)针对多窗口类浏览器模式问题,指出并分析了该问题存在的原因,利用Activity的运行机制,通过Fragment栈对主要模块的Webview进行管理,实现对不同模块之间切换的控制。 (2)针对跨域数据交互问题,指出并分析了...
6. **查询优化**:学习如何优化HQL查询,避免N+1查询问题,以及如何使用Criteria API或HQL的子查询提高性能。 7. **关联映射**:理解不同类型的关联映射(一对一、一对多、多对一、多对多),以及如何在HQL中处理...