[英]Hibernate mapping : HQL many-to-one Query - how to retrieve attributes of crossed pojo objects
我是一个使用Hibernate 4.3(xml风格)的初学者,当我不仅询问pojo元素时,我仍然坚持查询的方式。 我的意思......(见下一个例子)
我有两张桌子:人和地址。 在表Person中,我有一个引用Adress的外键'id_adress_fk'。 在表Adress中,我将'id'作为主键,将'Adress_Street_Name'作为属性。 一位参与者只能拥有一个地址。 一个地址有几个人住在那里。 我写了两个Pojos课。
我正在尝试请求数据库具有Person属性和Adress Street Name。 但我无法检索Adress Street Name。 我不明白返回什么对象,如何编写匹配返回的好对象的好查询。 我必须在地址和人之间建立联系吗? 但在这种情况下返回的对象是什么? 我怎么处理这个?
非常感谢。
我的pojos:
public class Person implements Serializable {
private Integer id;
private Adress adress;
// getters and setters
public class Adress implements Serializable {
private Integer id;
private Set<Person> persons = new HashSet<Person>(0);
// getters and setters
我的映射:
ADRESS.HBM.XML
<set name="persons" table="person" inverse="true" lazy="false" >
<key>
<column name="id_adress_fk" not-null="true" />
</key>
<one-to-many class="com.you.know.what.Person" />
</set>
PERSON.HBM.XML
<many-to-one name="adress" class="you.know.what.Adress" >
<column name="id_adress_fk" not-null="true" />
</many-to-one>
我的查询(例如):
List<Person> allPerson = getSessionFactory().getCurrentSession().createQuery( "from Person ").list();
我知道我只查询Pojo Person,但是Adress对象被“包含”在Person中,所以我应该成功检索Adress_street_name ......这样做可能很棒!
根据Hibernate的默认提取策略,当您加载实体时,默认情况下不会加载关联的实体(或映射到此实体的集合)。 因此,当您加载Person
列表时:
( "from Person ").list()
将不会加载关联的Address
实体,而是加载Address
的proxy
。 proxy
是映射的持久化类( Address
)的运行时生成的子类的占位符实例,它将所有方法调用委托给从数据库中懒惰地获取的另一个Address
实例。
要初始化代理,您需要打开Session并将对象附加到它。 这意味着当您已经结束工作单元并关闭Session或者从中分离对象时,Hibernate不再能够获取数据。
但您可以在运行时在代码中覆盖此默认提取策略; 这样,只要需要,您就可以加载Person
及其Address
:
getSessionFactory().getCurrentSession().createQuery( "from Person p left join fetch p.adress").list();
使用此查询,您将获得Person
列表及其Address
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.