看起来这是一个标准问题,但搜索解决方案没有成功。我有父类 Person
和两个子集:
class Person {
@OneToMany(mappedBy = "person", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
Set<Dog> dogs;
@OneToMany(mappedBy = "person", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
Set<Cat> cats;
}
子类 Cat
(类 Dog
看起来一样):
class Cat {
private String name;
@ManyToOne(targetEntity = Person.class, fetch = FetchType.EAGER)
@JoinColumn(name = "PERSON_ID")
public Person getPerson() {
return person;
}
}
什么问题。当我尝试检索所有 Persons
时,Cat
名称等于“Fritz”,Hibernate 在表 Cat
上创建连接查询,名称为“Fritz” '.一切看起来都很好,但是当我展开检索到的 Person
(在 Idea 调试器中)时,它包含 只有一个 Cat
实例(名称为“Fritz” ),尽管 Person
可以有多个 Cats
。在扩展的同时,Hibernate 向 Dog
表发出其他请求并检索与此 Person
链接的所有项目,并且此字段正确填充。我如何强制 Hibernate 用所有项目填充字段 Cat
,而不仅仅是用连接的项目?
P.S. 我使用 Spring 的 HibernateTemplate session.get(),而不是 HQL。
编辑 1. 生成的查询(第二部分仅当我在调试器中展开检索到的 Person
时执行):
Hibernate:
select
person.PERSON_ID,
person.PERSON_NAME,
cat.CAT_ID,
cat.NAME,
from
PERSON person
left outer join
CAT cat
on person.PERSON_ID=cat.PERSON_ID
where
cat.NAME='FRITZ'
Hibernate:
select
dog.DOG_ID,
dog.NAME,
dog.PERSON_ID
from
DOG dog
where
dog.DOG_ID=1
编辑 2. 看来我的问题是以前的 Hibernate bug .但我仍然需要帮助。我的 Hibernate 版本是 4.3。
最佳答案
我对使用调试器查看 hibernate 实际上如何映射关联没有信心。它使用按需填充的特殊集合,因为填充集合会导致额外的请求,而 Hibernate 试图在简单性和性能之间实现良好的结合。
因此,当您请求 *the person owning Pussicat` 时,Hibernate 只会在 Person 表上查询,除非您急切地加载子表,如果您列出该人的猫和狗,Hibernate 只会在子表上查询 < strong>在代码中而不是在调试器中。
而且您知道您不能急切地加载所有关联。如果这样做,任何简单的查询都可以加载所有数据库...
恕我直言,当你说 Hibernate 没有填充 cats Set 时,那只是因为 在调试器中 set 最初不是 null 也不是空的,所以 调试器 不会询问 hibernate 以发出查询。但是,如果您在代码中询问猫的列表,您会得到正确的结果。
关于java - Hibernate 只获取单个子实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26775252/