java - hibernate 映射: HQL many-to-one Query - how to retrieve attributes of crossed pojo objects

标签 java hibernate join hql hibernate-mapping

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

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

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

非常感谢。

我的pojo:

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>

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 是映射持久类 (Address) 的运行时生成子类的占位符实例,它将所有方法调用委托(delegate)给 Address 的不同实例code> 从数据库中延迟获取。

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

但是你可以在运行时在代码中覆盖这个默认的获取策略;这样,无论何时需要,您都可以加载 Person 及其 Address:

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

通过此查询,您将获得人员及其地址的列表。

关于java - hibernate 映射: HQL many-to-one Query - how to retrieve attributes of crossed pojo objects,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19375872/

相关文章:

java - Java 中的 XML 空格格式

mysql - SQL获取每个值的不同行数

mysql - 双数据MySQL JOIN

java - 将一个对象拆分为多个表

sql - 在一个连接表上使用组合条件连接

java - 如何覆盖 LWJGL 中的按键

删除尾随逗号期间正则表达式模式中的 Java 语法错误

java - 正则表达式单词末尾的特定字符

java - 如何为每个请求使用一个事务 Spring + Hibernate + Spring Security + JSF

java - 仅在辅助表中保留值