HibernateFire如何进行查询?
我有一对一的hibernate注释映射。比如说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")
@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() 等等。 希望你的疑虑消除