【问题标题】:Mapping a many-to-one relationship with a composite alternate key使用复合备用键映射多对一关系
【发布时间】:2014-11-23 03:46:41
【问题描述】:

我有两个实体 A 和 B 具有以下关系

  1. A 中的外键由不属于 B 的主键(备用键)的两列(复合)组成;
  2. A和B之间的基数是[*] -- [0..1],即A中的外键可以为null,多对一的关系是可选的;
  3. 关系是单向的 A --> B。我想通过连接在 A 中急切地加载 B。

如何为 A 和 B 编写休眠映射 .hbm(休眠 3,无注释)?

【问题讨论】:

    标签: java hibernate jpa orm hibernate-mapping


    【解决方案1】:

    您可以在父类(例如 A)中创建复合标识符属性:

        <properties name="ParentNaturalId">
            <property name="prop1" column="prop_1" />
            <property name="prop2" column="prop_2" />
        </properties>
    

    客户端通过这种多对一关联引用父级:

        <many-to-one name="parent" class="B" not-null="false" not-found="ignore" property-ref="ParentNaturalId" fetch="join">
            <column name="b_prop_1" />
            <column name="b_prop_2" />
        </many-to-one>
    
    1. 查看not-found="ignore"多对一属性:

    not-found (可选 - 默认为异常): 指定如何外来 将处理引用缺失行的键。忽略将处理 缺少行作为空关联。

    1. 查看fetch="join"多对一属性:

    fetch(可选 - 默认选择):在外连接之间进行选择 获取或顺序选择获取。

    【讨论】:

    • 能否提供第3点的权威参考?我对 hibernate 和 JPA 中的默认提取类型感到困惑。
    • 需求 2 由“not-found”属性解决,而需求 3 是 Hibernate 管理 *-to-one 关联的方式。默认情况下,所有多对一都急切地获取。 JPA 只定义了 EAGER 和 LAZY,每个 JPA 实现都定义了 EAGER 使用的模式(JOIN 或 SELECT)。 Check this document 获取一些 Hibernate 获取示例。
    • 您提供的链接表示惰性,默认选择。同样在这里developer.jboss.org/wiki/AShortPrimerOnFetchingStrategies 这似乎与您之前的评论相矛盾。你能澄清一下吗?
    猜你喜欢
    • 1970-01-01
    • 2015-07-18
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-27
    • 2011-05-29
    相关资源
    最近更新 更多