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

相关推荐

Global site tag (gtag.js) - Google Analytics