最好不要把lazy设置成true,那样数据量小的时候尚可以承担负荷的查询,如果数据量在上百上千之后,那么查询效率很底的,因为你每次查询的时候都会把你的所有的查询打开,比如你关联了2个表,那么这2个表的记录就都会被查,这样许多无用的也查出来的.
如果想不报session未关闭的话,那么最好使用左连接,这样就可以有效的防止这个问题了,但是你需要去指定你的对象,或者把对象封装起来也可以比如users是主表,引用了group ,rool
我们在映射文件中都配置好了对象,这样直接查询对象就可以了
string hql="from Users u left join u.group g left join g.rool r";
List list=getHibernateTemplate().find(hql);
可以这样做:
Users users=null;
if(list.size0){
Object[] obj=list.get(0);
users=(Users)obj[0];}return users;
然后在你需要的类里面可以这么调用:
user.getGroup.getrool.getXXXX();
这样可以,或者直接返回list也可以调用!
但是最好不要把lazy设置成true也许表达不好,但是看看应该明白,呵呵!
假设order 与 orderitem为一对多关联。
@onetomany(mappedby = "order", cascade = cascadetype.all, fetch = fetchtype.lazy)
@onetomany: 指明order 与orderitem关联关系为一对多关系
mappedby: 定义类之间的双向关系。如果类之间是单向关系,不需要提供定义,如果类和类之间形成双向关系,我们就需要使用这个属性进行定义,
否则可能引起数据一致性的问题。
cascade: cascadetype[]类型。该属性定义类和类之间的级联关系。定义的级联关系将被容器视为对当前类对象及其关联类对象采取相同的操作,
而且这种关系是递归调用的。举个例子:order 和orderitem有级联关系,那么删除order 时将同时删除它所对应的orderitem对象。
而如果orderitem还和其他的对象之间有级联关系,那么这样的操作会一直递归执行下去。cascade的值只能从cascadetype.persist(级联新建)、
cascadetype.remove(级联删除)、cascadetype.refresh(级联刷新)、cascadetype.merge(级联更新)中选择一个或多个。
还有一个选择是使用cascadetype.all,表示选择全部四项。
fatch: 可选择项包括:fetchtype.eager 和fetchtype.lazy。前者表示关系类(本例是orderitem类)在主类(本例是order类)加载的时候同时加载;
后者表示关系类在被访问时才加载,默认值是fetchtype. lazy。
你应该使用 fetchtype.eager
用户登录
还没有账号?立即注册
用户注册
投稿取消
文章分类: |
|
还能输入300字
上传中....