Hibernate 查询1+N问题详解
来源:互联网 发布:淘宝海外叫什么 编辑:程序博客网 时间:2024/05/29 04:43
1、1+N简单来说就是,Person和Phone是一对多关系,现在我看看所有手机的信息,对于其属于哪个人不感兴趣,但把lazy设为false(lazy=false),这样就会发出1(查询手机的sql)+N(和所有查询的这些手机相关的Person的查询sql),这样会造成很大的性能开销。
首先列一下会产生1+N问题的代码
Person:
private int id;private String name;private int age;
Person.hbm.xml按照常规配置即可
Phone:
private int id;private String type;private String description;private Person person; //关联一个用户
Phone.hbm.xml:
<hibernate-mapping> <class name="com.akwolf.n_1.Phone" table="PHONE"> <id name="id" type="int"> <column name="ID" /> <generator class="native" /> </id> <property name="type" type="java.lang.String"> <column name="TYPE" /> </property> <property name="description" type="java.lang.String"> <column name="DESCRIPTION" /> </property> <!-- lazy=false --> <many-to-one name="person" class="com.akwolf.n_1.Person" fetch="join" lazy="false"> <column name="PERSON_ID" /> </many-to-one> </class></hibernate-mapping>
为了使效果明显一点,假定一个手机对应一个不同的用户,现在想数据库中添加一些数据:
@Testpublic void testSave1() {Session session = HibernateUtil.getSessionFactory().getCurrentSession();session.beginTransaction();Person person;Phone phone;for (int i = 0; i < 10; i++) {person = new Person(0, "zhangsan" + i, 21 + i);phone = new Phone(0, "glay" + i, "android智能手机", person);session.save(person);session.save(phone);}session.getTransaction().commit();}
进行一下下面的查询会看到,控制台输出大量的sql
@Testpublic void testQuery1() {Session session = HibernateUtil.getSessionFactory().getCurrentSession();session.beginTransaction();List<Phone> list = (List<Phone>) session.createQuery("from Phone").list();for (Phone phone : list) {System.out.println(phone.getId()); //对关联的Person并不感兴趣// System.out.println(phone.getId()+"---"+phone.getPerson().getName());}session.getTransaction().commit();}
1、还是在Phone.hbm.xml中把对于Person关联的映射属性不进行lazy属性的设置,默认为lazy加载
<hibernate-mapping> <class name="com.akwolf.n_1.Phone" table="PHONE"> <id name="id" type="int"> <column name="ID" /> <generator class="native" /> </id> <property name="type" type="java.lang.String"> <column name="TYPE" /> </property> <property name="description" type="java.lang.String"> <column name="DESCRIPTION" /> </property> <!-- lazy=true --> <many-to-one name="person" class="com.akwolf.n_1.Person" fetch="join"> <column name="PERSON_ID" /> </many-to-one> </class></hibernate-mapping>
2、在lazy=false的情况下,在hql中使用join fetch进行查询(session.createCriteria就是采用连接查询的方式),如:
@Testpublic void testQuery2() {Session session = HibernateUtil.getSessionFactory().getCurrentSession();session.beginTransaction();List<Phone> list = (List<Phone>) session.createQuery("from Phone p left join fetch p.person per").list();for (Phone phone : list) {// System.out.println(phone.getId());System.out.println(phone.getId() + "---"+ phone.getPerson().getName());}session.getTransaction().commit();}
3、对于在Person中设置batch-size应该不算是一种解决方案,对于海量的数据,设置的一些batch-size对于大体来说是无关痛痒的。
ok,这就是小弟看视频对于1+N问题的一点理解,有理解更为深刻的大虾不吝赐教。。
- Hibernate 查询1+N问题详解
- hibernate N+1查询问题
- hibernate 查询n+1问题
- HIBERNATE的N+1查询问题
- hibernate查询的1+n问题
- HIBERNATE的N+1查询问题
- HIBERNATE的N+1查询问题
- Hibernate 查询缓存 1+N的问题.
- hibernate n+1查询
- hibernate之优化抓取(优化指导方针---n+1查询问题)
- [hibernate]什么是n+1次select查询问题?
- hibernate 查询极慢,最后查出是N+1问题
- Hibernate 一级缓存 二级缓存 1+N问题 查询缓存
- Hibernate的N+1条SQL查询问题-------Iterate
- hibernate n+1查询一
- Hibernate n+1问题
- hibernate N+1问题
- hibernate N+1问题
- 循环dictionary
- 苹果、google、微软的那些事(iPhone)
- 手机上的HTML5框架 Sencha Touch
- WEB应用程序基础
- php中ereg()函数和eregi()函数-字符串对比解析函数
- Hibernate 查询1+N问题详解
- 如何使用glew
- VC++6.0使用CSplitterWnd类分割窗体,拆分窗体
- 每日一句1
- EditText的一些使用注意点
- Android 2.2 API demo
- struts1多文件上传
- NEC项目积累--String.IsNullOrEmpty
- linux下线程池创建