【问题标题】:Hibernate, how to model this relationshipHibernate,如何建模这种关系
【发布时间】:2010-07-28 01:12:50
【问题描述】:

我有下表。

create table logical_id_seq (
    logical_id int auto_increment,
    primary key(logical_id)
);

create table mytable (
    physical_id int auto_increment,
    logical_id int not null references parent(logical_id),
    data varchar(20),
    primary key(physical_id)
);

第二个表使用第一个表自动生成的值作为其值。我不知道如何在休眠中对此进行建模。

我读了http://docs.jboss.org/hibernate/core/3.3/reference/en/html/mapping.html#mapping-declaration-onetoone,但我似乎不明白。

【问题讨论】:

    标签: mysql nhibernate hibernate


    【解决方案1】:

    其实很难说,不知道你想在对象级别表示什么:是不是一对一的外键关联?多对一关联?关联是双向的吗?使用 ORM 意味着考虑对象而不是表,它通常有助于提供对象模型。

    我假设这是一个一对一的外键关联。以下是 Java Persistence with Hibernate 的建议:

    7.1.2 一对一的外键关联

    不是共享一个主键,而是两个 行可以有一个外键 关系。一桌有洋 引用主要的键列 关联表的键。 (这 此外键的源和目标 约束甚至可以是同一张表: 这称为自引用 关系。)

    让我们从用户更改映射 到一个地址。而不是共享 主键,你现在添加一个 SHIPPING_ADDRESS_ID 列中的 USERS 表:

    <class name="User" table="USERS">
      <many-to-one name="shippingAddress"
                   class="Address"
                   column="SHIPPING_ADDRESS_ID"
                   cascade="save-update"
                   unique="true"/>
    </class>
    

    用于此的 XML 中的映射元素 关联是 &lt;many-to-one&gt; — 不是 &lt;one-to-one&gt;,你可能有 预期的。原因很简单:你 不在乎目标端有什么 协会的,所以你可以对待 它就像一个 to-one 关联,没有 许多部分。你想要的只是 表达“这个实体有一个财产 这是对一个实例的引用 另一个实体”并使用外键 字段来表示这种关系。 此映射的数据库架构 如图7.3所示。

    图 7.3 一对一的外来语 USERSADDRESS

    附加约束强制执行此操作 真正的一对一关系。经过 制作SHIPPING_ADDRESS_ID 列唯一,您声明一个 具体地址可以参考 最多由一个用户作为运费 地址。这不如 来自共享主键的保证 关联,它允许特定的 最多被引用的地址 一位用户,期间。与几个外国 关键列(假设你也有 独特的HOME_ADDRESS_IDBILLING_ADDRESS_ID),你可以 引用相同的地址目标行 几次。但无论如何,两个 用户不能共享相同的地址 相同的目的。

    让我们从用户建立关联 到地址双向。

    反向属性引用

    最后一个外键关联是 从用户映射到地址 &lt;many-to-one&gt; 和一个独特的 约束以保证所需的 多样性。什么映射元素可以 您在地址端添加以制作 这个关联是双向的,所以 从地址到用户的访问是 在 Java 领域模型中可能吗?

    在 XML 中,您创建一个 &lt;one-to-one&gt; 使用属性引用进行映射 属性:

    <one-to-one name="user"
                class="User"
                property-ref="shippingAddress"/>
    

    你告诉 Hibernate 用户 Address 类的属性是 另一个属性的倒数 协会的一方。你现在可以 致电anAddress.getUser() 访问 您的收货地址的用户 给定的。没有额外的列 或外键约束;休眠 为您管理此指针。

    如果你所拥有的实际上是一个真正的多对一关联,那么调整上述解决方案应该很容易。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多