HibernateFire如何进行查询?

HibernateFire如何进行查询?,hibernate,hibernate-mapping,Hibernate,Hibernate Mapping,我有一对一的hibernate注释映射。比如说 @Entity @Table(name="person") class Person{ @OneToOne( mappedBy = "person", cascade = CascadeType.ALL) private Passport passport; ...... } @Entity @Table(name="passport")

我有一对一的hibernate注释映射。比如说

     @Entity
     @Table(name="person")
     class Person{
       @OneToOne( mappedBy = "person", cascade = CascadeType.ALL)    
       private Passport passport;
       ......
     }

     @Entity
     @Table(name="passport")
     class Passport{
     @OneToOne
     @JoinColumn(name = "statusid")
     private Person person;
     ......
     .....
     }
在这里,
个人
是所有者,
护照
是所有者。当我对
person
执行
select
操作时,为什么hibernate会触发两个查询,即从
person
passport
中进行选择。 根据hibernate文档

the owner is responsible for the association column(s) update

关系所有者的概念与您的问题无关。正如您从文档提示中摘录的那个样,在保持关系时会咨询拥有方。这并不意味着关系的另一方被懒散地加载


用例需要的是一对一关系的延迟加载。不幸的是,Hibernate不支持它。绕过这一限制的典型方法是定义一边是一对一,另一边是一对多(懒惰)的关系

由于您添加了-cascadall字段,因此触发了两个查询 (在一对一映射中) hibernate在这里做什么。它带来了所有引用字段的数据

1-假设您选择了一个id为3的人员

2-然后在dao层中将有一个具有以下语法的方法

Person finbyid(整数personid) { ......... ........ 返回人; }

3-和相应的sql查询类似

从id=3的人员中选择*

4-hibernate在这里还做了一件事-

它还带来了与之关联的所有passport对象

所以你可以 Passport pass=person.getPassport()

现在Passport的pass对象将包含所有列,不会触发单独的查询。 您可以直接使用 pass.getPassportid(); pass.getPassportnumber()

等等。 希望你的疑虑消除