问题简述
4个类Category ,topic ,msg,msginfo。都是多对一的关系
一个模块下面有多个主题,一条主题下面有多条消息。
获取topic时,把topic有导航关系的数据全部取出来
解决办法
- 把fetchtapy设置为lazy,需要在发出。(不用使用关联对象的情况下使用)
@ManyToOne(fetch=FetchType.LAZY)
public Category getCategory() {
return category;
}
- 使用@batchSize(size=5),在获取数据时一次发出5条。如果设置10,则就发一次就可以了。但是不灵活。
package com.hibernate.model;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import org.hibernate.annotations.BatchSize;
@Entity
@BatchSize(size=5)
public class Category {
private int id;
...
}
- 使用join fetch,建立外连接(使用关联对象)
public void testQuery(){
Session session = sf.openSession();
session.beginTransaction();
//这里使用的时t.category而不是Categogy,是因为
//假设topic中设置了一个Categogy类型的其他字段,将会发生冲突。
List<Topic> topics = (List<Topic>) session.createQuery("from Topic t left join fetch t.category c").list();
for(Topic t:topics){
System.out.println(t.getId()+"-"+t.getTitle());
}
session.getTransaction().commit();
session.close();
}