`
fan2012
  • 浏览: 68521 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

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

所以结果是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故意不实现这个功能。
分享到:
评论
2 楼 fan2012 2011-02-14  
如果结果有多条,只返回第一条
1 楼 beer2008cn 2011-02-12  
criteria.setMaxResults(1).uniqueResult();

这是怎么回事?

相关推荐

    hibernate-validator-annotation-processor-5.1.0.CR1.zip

    【标题】"Hibernate Validator Annotation Processor 5.1.0.CR1" Hibernate Validator 是一个流行的开源验证框架,它基于JSR 303/JSR 349(Bean Validation)标准,为Java应用程序提供了强大的数据验证功能。...

    annotation.rar

    在这个"annotation.rar"压缩包中,我们有两个文件:`bug.txt`和`annotation`,它们分别代表了对注解的实践应用和可能的错误记录。 1. **注解的基本概念** - 注解是一种声明式的编程元素,可以附加在源代码的类、...

    AHibernate1.1

    早期版本AHibernate1.0下载地址:http://download.csdn.net/detail/lk_blog/4222048 本版主要修改的内容: ...注:使用混淆时最好在proguard.cfg文件添加设置:-keepattributes *Annotation* 6.其他一些bug.

    JSR303jar包

    2. `hibernate-validator-annotation-processor-5.0.0.CR2.jar`:这个文件是Hibernate Validator的注解处理器,它可以在编译时帮助检查和生成与验证相关的元数据,提高开发效率,并且能在早期发现潜在的错误。...

    最新版spring-framework-4.3.12.RELEASE-docs.zip源码

    例如,`org.springframework.beans.factory.annotation.Autowired`注解用于实现依赖注入,`org.springframework.web.bind.annotation.RequestMapping`用于处理HTTP请求映射,`org.springframework.context....

    使用junit测试ssh中的dao

    JUnit4是目前广泛使用的版本,它引入了注解(Annotation)来简化测试代码,如@Test用于标记测试方法,@Before和@After用于定义在每个测试方法之前和之后执行的设置和清理操作。快速入门文档“JUnit4快速入门(已阅)....

    springframework.5.0.12.RELEASE

    Exporting a lazily initialized bean (which implements SelfNaming and is annotated with ManagedResource annotation) gives IllegalStateException [SPR-17592] #22124 MockHttpServletRequest changes Accept-...

    330 个 有用的Java Tips

    19. **JPA与Hibernate**:Java持久层API(JPA)和Hibernate是ORM(对象关系映射)工具,简化了数据库操作。 20. **Java性能调优**:包括JConsole、VisualVM等工具的使用,以及对内存、CPU、GC的监控和优化。 以上...

    spring 4.3.6 文档

    Spring 4.3.6是Spring框架的一个稳定版本,它包含了一系列增强特性和修复的bug,为开发者提供了更强大和灵活的工具来构建基于Java的企业级应用。文档分为两部分:javadoc-api和spring-framework-reference,这两部分...

    xdoclet-bin-1.2.3

    《XDoclet-Bin-1.2.3:自动化...然而,随着Java注解处理机制的发展,如Java的APT(Annotation Processing Tool)和现代构建工具Maven、Gradle的普及,XDoclet的使用逐渐减少,但它在特定时期对Java开发的贡献不容忽视。

    springmvc&JSR303;的jar包

    2. 配置Spring MVC:启用JSR303验证,可以通过`&lt;mvc:annotation-driven validation="true"&gt;` 或在配置类中启用`@EnableWebMvc`和`@InitBinder`方法。 3. 使用注解:在模型对象的字段上直接使用JSR303验证注解。 4. ...

    march2021

    10. **注解(Annotation)**:用于提供元数据,可以用于编译时和运行时的处理。 11. **模块系统**:Java 9引入了模块系统,增强了大型应用的组织和隔离。 12. **JavaFX**:用于构建桌面应用程序的图形用户界面。 ...

Global site tag (gtag.js) - Google Analytics