【问题标题】:Hibernate Query Problem休眠查询问题
【发布时间】:2010-12-16 20:20:35
【问题描述】:

我正在使用休眠。我的数据库如下

一个类别有很多属性

类类别 包含

private Set <Attribute> AllAttributes= new HashSet  <Attribute>();

类属性

我如何检索所有类别及其属性,因为我正在尝试“从类别”但它不起作用

类别映射文件:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated Dec 16, 2010 8:37:02 AM by Hibernate Tools 3.4.0.Beta1 -->
<hibernate-mapping>
    <class name="com.BiddingSystem.Models.Category" table="CATEGORY">
        <id name="CategoryId" type="long">
            <column name="CATEGORYID" />
            <generator class="native" />
        </id>
        <property name="CategoryName" type="java.lang.String">
            <column name="CATEGORYNAME" />
        </property>

        <many-to-one name="ParentCategory" class="com.BiddingSystem.Models.Category">
            <column name="PARENT_CATEGORY_ID" />
        </many-to-one>

        <set name="SubCategory" lazy="false" cascade="all-delete-orphan" inverse="true">
            <key>
                <column name="PARENT_CATEGORY_ID" />
            </key>
            <one-to-many class="com.BiddingSystem.Models.Category" />
        </set>

        <set name="AllAttributes" table="ATTRIBUTE" inverse="false" lazy="true"  cascade="all">
            <key>
                <column name="CATEGORYID" />
            </key>
            <one-to-many class="com.BiddingSystem.Models.Attribute" />
        </set>

    </class>
</hibernate-mapping>

属性映射文件:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated Dec 16, 2010 5:25:09 AM by Hibernate Tools 3.4.0.Beta1 -->
<hibernate-mapping>
    <class name="com.BiddingSystem.Models.Attribute" table="ATTRIBUTE">
        <id name="AttributeId" type="long">
            <column name="ATTRIBUTEID" />
            <generator class="native" />
        </id>
        <property name="AttributeName" type="java.lang.String">
            <column name="ATTRIBUTENAME" />
        </property>
        <set name="Options" table="ATTRIBUTEOPTION" inverse="false"  cascade="all">
            <key>
                <column name="ATTRIBUTEID" />
            </key>
            <one-to-many class="com.BiddingSystem.Models.AttributeOption" />
        </set>
    </class>
</hibernate-mapping>

【问题讨论】:

  • 定义“不工作”?您的映射文件/映射注释是什么?

标签: java sql hibernate join hql


【解决方案1】:

您已将关联映射到lazy="true"。这告诉hibernate,默认情况下,类别的属性应该只在实际访问时才从数据库中加载,而lazy="false" 则指示hibernate 在加载类别时加载属性。但是,映射文件中的指令会影响所有查询。

如果您只希望它用于特定查询,请查看 http://docs.jboss.org/hibernate/core/3.5/reference/en/html/queryhql.html#queryhql-joins

“获取”连接允许关联或 值的集合 与他们的父母一起初始化 使用单个选择的对象。这是 特别有用的情况下 收藏。它有效地覆盖 外连接和惰性声明 关联的映射文件 和收藏。见第 20.1 节, “获取策略”了解更多信息 信息。

from Cat as cat
    inner join fetch cat.mate
    left join fetch cat.kittens

获取连接通常不需要 分配一个别名,因为 不应使用关联对象 在 where 子句(或任何其他 条款)。关联的对象是 也没有直接在 查询结果。相反,它们可能是 通过父对象访问。这 您可能需要别名的唯一原因是 如果你递归加入获取 进一步收集:

from Cat as cat
    inner join fetch cat.mate
    left join fetch cat.kittens child
    left join fetch child.kittens

fetch 构造不能用于 使用 iterate() 调用的查询(虽然 可以使用滚动())。抓取应该是 与 setMaxResults() 一起使用或 setFirstResult(),作为这些操作 基于结果行 通常包含重复的渴望 集合获取,因此,数字 行数不是您所期望的。 Fetch也不应该一起使用 即兴有条件。这是 可以创建笛卡尔积 通过加入获取多个 查询中的集合,因此请注意 这个案例。加入获取多个 收集角色可以产生 包映射的意外结果, 因此建议用户自行决定何时 在这种情况下制定查询。 最后,请注意完全连接获取和 right join fetch 没有意义。

【讨论】:

    猜你喜欢
    • 2010-12-06
    • 2013-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多