六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 65|回复: 0

Hibernate annotation的bug

[复制链接]

升级  0%

10

主题

10

主题

10

主题

秀才

Rank: 2

积分
50
 楼主| 发表于 2013-1-19 04:15:00 | 显示全部楼层 |阅读模式
Classroom班级表与Student学生表是简单的一对多的关系

public class Student {private Integer id;private Classroom classroom;private String name;    /*省略get set方法*/}public class Classroom {private Integer id;private String name;private Set<Student> students = new HashSet<Student>();    /*省略get set方法*/}
下面是用annotation设置其双向关联的代码。
在Classroom中设置
@ManyToOne(fetch = FetchType.LAZY)@JoinColumn(name = "classroom_id", nullable = true)public Classroom getClassroom() {return this.classroom;}
在Classroom中设置
注:这里“立即加载”是故意的,因为业务特殊性所以没有考虑用“延迟加载”。
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "classroom")public Set<Student> getStudents() {return this.students;}

下面是需求:
查询出班级编号最小的班级信息和此班级里所有学生信息

用criteria查询,主体代码是这样写的
Criteria criteria = session.createCriteria(Classroom.class);criteria.addOrder(Order.asc("id"));criteria.setMaxResults(1).uniqueResult();
此查询生成的sql语句大致如下:
select c.*, s.* from classroom c left outer join student s on c.id=s.classroomId order by classroom.id desc limit 1
所以结果是classroom的信息查询出来了,但是些班级中的学生信息只查到一个。如果classroom.getStudents()得到的是1。
看了sql语句后就找到问题原因了,都是因为left outer join连接查询惹的祸。如果能进行2次查询,每一次

select * from classroom order by id limit 1;select * from student where student.class_id = ***

多好呀。

以前用.hbm.xml配置时有选项fetch="join/select"貌似可以实现这个功能,而annotation中却无此选项。不知这是annotation的bug,还是annotation故意不实现这个功能。
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表