java - Hibernate 只获取单个子实例

标签 java hibernate

看起来这是一个标准问题,但搜索解决方案没有成功。我有父类 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/

相关文章:

java - 无法建立 JDBC 连接 [jdbc :postgres://localhost:5432/hibernatedb]

java - 从 thenReturn mockito 返回迭代器

java - 是否应该更改 hibernate 生成的代码以满足需要?

spring - Maven 依赖 - org.hibernate.engine.spi.SessionFactoryImplementor.getProperties()Ljava/util/Properties 上的 NoSuchMethodError

java - javafx可以打印到点阵打印机吗?

java - 根据session动态选择数据库

java - @Delete 返回 HTTP 状态 405 - 不允许方法

java - 是 Java 8 中任何用途的抽象类

java - 有一个实例变量作为最终点?

java - Java POJO 中的字段、变量、属性和属性有什么区别?