0 0

HIBERNATE 双向一对一 查询 对象 老是 N+15

环境很简单,两个类,Book 和 BookDetail,唯一外键类型的双向一对一,互相引用

public class Book {
	private int id;
	private String name;
	
	private BookDetail detail;
}


public class BookDetail {
	private int id;
	private String summary;

	private Book book;
}


两个类的hbm文件:
<hibernate-mapping package="com.sina.domain">
	<class name="Book" table="Book" dynamic-insert="true" dynamic-update="true">
		<id name="id" type="int">
			<generator class="identity"></generator>
		</id>
		
		<property name="name" type="string" not-null="true"/>
		<!-- 
		 -->
		<one-to-one name="detail" class="BookDetail" property-ref="book"/>
	</class>
</hibernate-mapping>


 <hibernate-mapping package="com.sina.domain">
	<class name="BookDetail" table="BookDetail" dynamic-insert="true" dynamic-update="true" batch-size="10">
		<id name="id" type="int">
			<generator class="identity"></generator>
		</id>
		<property name="summary" type="string" />
		
		<many-to-one name="book" column="book_id" class="Book" unique="true"/>
	</class>
</hibernate-mapping>


加入数据库里有3条Book记录,3条BookDetail记录
如果我只想查book,不想查BookDetail针对book查询:
// There are for example 3 books in DB
List<Book> booklist = session.createQuery("from Book b").list();


却得到一下的SQL:
Hibernate: select book0_.id as id1_0_, book0_.name as name2_0_ from Book book0_
Hibernate: select bookdetail0_.id as id1_1_0_, bookdetail0_.summary as summary2_1_0_, bookdetail0_.book_id as book_id3_1_0_ from BookDetail bookdetail0_ where bookdetail0_.book_id=?
Hibernate: select bookdetail0_.id as id1_1_0_, bookdetail0_.summary as summary2_1_0_, bookdetail0_.book_id as book_id3_1_0_ from BookDetail bookdetail0_ where bookdetail0_.book_id=?
Hibernate: select bookdetail0_.id as id1_1_0_, bookdetail0_.summary as summary2_1_0_, bookdetail0_.book_id as book_id3_1_0_ from BookDetail bookdetail0_ where bookdetail0_.book_id=?


无缘无辜多了3条BookDetail的sql,请问怎么设置能够只查Book(Book对象里的的关联detail采用懒加载),谢谢

问题补充:hen
    谢谢楼上的两位,查了好久,终于知道答案了,因为这种以唯一外键的一对一,由于外键在BookDetail中,如果访问Book,由于Book没有外键,所以当填充Book中的detail属性的时候,由于拿不到外键(如果有外键的话,空就为null,有外键就proxy一个主键为此外键的代理对象),所以只能查BookDetail表,如果为空,则设置detail对象为空,如果有一条记录,则设置detail为此记录,如果多于1条,则报错(非唯一),基本的流程是这样,解决的方法是由于BookDetail容量比较大,Book较小,所以将外键放到Book里面比较好,这样查Book的时候不会加载BookDetail。写了这么多希望后来碰到这个双向一对一的人看到
2013年11月28日 16:28

3个答案 按时间排序 按投票排序

0 0

跟一句: 赞扬楼主好学求真的精神!

2013年11月29日 12:53
0 0

可以在<one-to-one>中使用cascade属性设置需要级联的操作,如果不设置cascade属性,其对应的值为CascadeType.all,所以你查询的时候sql会多出几条。

2013年11月28日 20:33
0 0

在Book映射文件加入 constrained=true

http://alleni123.iteye.com/blog/1978000
我之前也遇到这个

2013年11月28日 19:51

相关推荐

    hibernate N+1问题解决办法

    当我们在Hibernate中使用懒加载或集合查询时,如果在一次循环中对每个实体逐一触发关联对象的加载,就会产生N+1次数据库查询。例如,假设有一个`Order`实体,它有一对多的关联关系到`Product`实体,我们想要获取所有...

    hibernate n+1查询

    HIBERNATE的N+1查询问题 关联查询时

    深入剖析hibernate的n+1问题和缓存问题

    例如,在上述文档中提到的,iterator()方法会先发出一条获取ID列表的SQL,然后根据需要逐个对象发出获取具体信息的SQL,这就形成了N+1条SQL查询。 为了解决N+1问题,Hibernate推荐使用list()方法来替代iterator()...

    hibernate的n+1问题.docx

    N+1次SELECT查询问题源于Hibernate的默认行为。当从数据库中加载一个对象及其关联对象时,如果不做特别处理,Hibernate会为每个主对象单独执行一次查询来获取其关联对象,导致查询次数过多。以Customer和Order为例,...

    How to solve the hibernate N+1 problem?

    N+1问题是指在进行一对多或多对多关联查询时,原本期望通过一次SQL查询获取所有数据,但实际执行了N+1次查询,其中N为一端实体的数量,这极大地影响了应用性能。 描述中提到的链接指向了一篇博客文章,虽然具体内容...

    浅谈Hibernate n+1问题

    2. 使用二级缓存,在对象更新、删除、添加相对于查询要少得多时,二级缓存的应用将不怕 n+1 问题,因为即使第一次查询很慢,之后直接缓存命中也是很快的。 3. 设定 fetch=join(annotation : @ManyToOne() @Fetch...

    Spring + Hibernate + Spring mvc +Ajax 整合

    1. **实体类(Entity)**:这些类代表数据库中的表,使用Hibernate注解如@Entity、@Id等,用于对象关系映射。 2. **SessionFactory配置**:在Spring配置文件中,配置Hibernate的SessionFactory,通常使用`...

    jsp+Spring+hibernate 博客系统

    业务逻辑可能涉及对数据库的操作,这时Hibernate作为ORM工具,会将Java对象转换为SQL语句执行,然后将结果再次转换回Java对象返回给控制器。最后,控制器将数据传递给JSP页面,由JSP生成响应并返回给用户。 **Web...

    struts2+spring2+hibernate3注册查询搜索分页实例

    再者,Hibernate3是一个强大的ORM(对象关系映射)框架,它允许开发者用Java对象来操作数据库。在查询和搜索功能中,Hibernate3通过HQL(Hibernate查询语言)或 Criteria API来执行SQL查询,简化了数据库操作。在...

    使用Mysql+Maven+Hibernate的一对一,一对多的CURD小案例

    在这个“使用Mysql+Maven+Hibernate的一对一,一对多的CURD小案例”中,我们将探讨如何在Java Web开发中结合这三个关键技术实现数据的创建(Create)、读取(Read)、更新(Update)和删除(Delete)操作。...

    struts + spring + hibernate + velocity + ajax + jotm + acegi

    struts + spring + hibernate + velocity + ajax + jotm + acegi

    gwt+spring+hibernate

    Hibernate提供了对象持久化、查询语言(HQL)和缓存机制,简化了数据库操作,提高了开发效率。 在"**gwt+spring+hibernate**"整合的例子中,可能包含以下关键点: - **GWT-RPC**: 用于GWT客户端和Spring服务端之间的...

    hibernate表之间3种双向关联映射

    然而,也需要注意处理好懒加载和级联操作,避免出现N+1查询问题和数据冗余。在实际应用中,根据业务需求选择合适的关联类型,合理设计实体结构,能够优化数据库查询效率,提升系统性能。 总结来说,Hibernate中的...

    jsp+servlet++hibernate+购物车系统

    【标题】"jsp+servlet+hibernate+购物车系统"是一个基于Web的电商应用程序,它结合了三种核心技术:JavaServer Pages(JSP)、Servlet和Hibernate。这个系统旨在实现一个完整的购物过程,包括商品浏览、选择商品加入...

    hibernate+++++++++

    Hibernate 是一个开源的对象关系映射(ORM)框架,它允许Java开发者将数据库操作与对象模型进行无缝集成。在Java世界中,ORM框架如Hibernate极大地简化了数据库编程,减少了手动编写SQL语句的需求,并且提供了更高...

    spring+struts1+hibernate+jbpm实例

    标题中的"spring+struts1+hibernate+jbpm实例"揭示了这是一个基于Java技术栈的Web应用程序开发实例,其中涉及四大核心技术:Spring、Struts1、Hibernate和JBPM。接下来,我们将深入探讨这些技术及其在实际项目中的...

    jsp+JavaScript+struts+hibernate+css+mysql的网上书店

    4. **Hibernate**:Hibernate是一个强大的对象关系映射(ORM)框架,它简化了Java应用与数据库之间的数据操作。在这个网上书店项目中,Hibernate可能是用来处理数据库操作,如添加、删除、更新书籍信息,以及处理...

    影院信息查询(java+jsp+hibernate+dwr框架+分页技术+ajax+oracle)

    【标题】:“影院信息查询(java+jsp+hibernate+dwr框架+分页技术+ajax+oracle)”是一个综合性的Web应用项目,它利用了一系列先进的技术和工具来实现对影院信息的高效、交互式查询。这个项目的核心在于,它展示了...

    hibernate+struts1实现添删改查

    这个主题涉及到两个核心的技术:Hibernate,一个强大的对象关系映射(ORM)框架,以及Struts1,一个早期的Model-View-Controller(MVC)架构。 **Hibernate** 是Java领域中广泛使用的ORM框架,它允许开发者用面向...

    springmvc+spring+hibernate

    Spring MVC、Spring 和 Hibernate 是Java Web开发中的三大主流框架,它们各司其职,共同构建了一个强大而灵活的后端架构。Spring MVC 负责处理HTTP请求并将其路由到相应的控制器,Spring 提供了依赖注入(DI)和面向...

Global site tag (gtag.js) - Google Analytics