Hibernate annotation的bug

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

[color=red]所以结果是classroom的信息查询出来了,但是些班级中的学生信息只查到一个。如果classroom.getStudents()得到的是1。[/color]
看了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故意不实现这个功能。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值