0

我是使用 Hibernate 4.3(xml 样式)的初学者,当它不仅询问 pojo 元素时,我还坚持使用查询方式。我的意思是……(见下一个例子)

我有两个表:Person 和 Adress。在表 Person 中,我有一个引用地址的外键“id_adress_fk”。在表 Adress 中,我将“id”作为主键,将“Adress_Street_Name”作为属性。一位参与者只能有一个地址。一个地址有几个人住在那里。我写了两个 Pojos 类。

我正在尝试请求数据库具有人员属性和地址街道名称。但我无法检索地址街道名称。我不明白返回什么对象,如何编写与返回的好对象匹配的好查询。我必须在 Adress 和 Person 之间加入吗?但在这种情况下,返回的对象是什么?我该如何处理?

非常感谢。

我的优点:

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

我的映射:

地址.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>

人.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...这方面的帮助可能会很棒!

4

1 回答 1

2

根据 Hibernate 默认的抓取策略,当你加载一个实体时,关联的实体(或者映射到这个实体的集合)默认是不加载的。因此,当您加载以下列表时Person

( "from Person ").list()

关联的实体Address不会被加载,而是会加载一个。A是映射持久类 ( ) 的运行时生成的子类的占位符实例,它将所有方法调用委托给从数据库中延迟获取的不同实例。proxyAddressproxyAddressAddress

要初始化代理,您需要打开 Session 和要附加到它的对象。这意味着当您已经结束工作单元并关闭 Session 或从其中分离对象时,Hibernate 无法再获取数据。

但是您可以在代码中在运行时覆盖此默认获取策略;这样,在需要时,您可以Person与它们一起加载Address

getSessionFactory().getCurrentSession().createQuery( "from Person p left join fetch p.adress").list();

使用此查询,您将获得一个列表Person以及他们的Address.

于 2013-10-15T09:26:16.520 回答