环境很简单,两个类,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。写了这么多希望后来碰到这个双向一对一的人看到
相关推荐
HIBERNATE的N+1查询问题 关联查询时
深入理解hibernate的缓存问题和配置,提高使用hibernate的效率
NULL 博文链接:https://cdxs2.iteye.com/blog/1936071
hibernate的n+1问题.docx
Spring + Hibernate + Spring mvc +Ajax 整合 框架,一个简单的添加删除。
struts + spring + hibernate + velocity + ajax + jotm + acegi
使用Struts2+Hibernate实现对部门表、员工表两张表的增删改查。
以上是springmvc+spring+hibernate整合基于eclipse,oracle开发
spring+struts1+hibernate+jbpm实例
jsp+servlet +hibernate 购物车系统
Spring Hibernate查询实用程序Spring应用程序中不再有N + 1个查询Spring Hibernate Query Utils:一种在Spring / Hibernate应用程序中检测N + 1查询并计算查询次数的简便方法·目录用夹具测试检测配置使能够错误等级...
Struts1+Spring+hibernate
hibernate+ehcache hibernate+ehcache hibernate+ehcache hibernate+ehcache hibernate+ehcache
JSF+SPRING+HIBERNATE
主要介绍了浅谈Hibernate n+1问题,怎么解决n+1问题,文中也作了简要分析,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
Struts+Spring+Hibernate+Jsf
Ajax+Spring+HibernateAjax+Spring+HibernateAjax+Spring+HibernateAjax+Spring+HibernateAjax+Spring+HibernateAjax+Spring+HibernateAjax+Spring+HibernateAjax+Spring+Hibernate
续: 博客系统 blog_1 因为文件较大无法一次性上传,故分为两步上传 blog_2里面是webroot(myeclipse编写) blog_1里面是源文件等 希望能给大家个帮助
spring+hibernate+struts
spring +struts + hibernate 例子 spring +struts + hibernate 例子 spring +struts + hibernate 例子