Hibernate,如何建模这种关系

时间:2010-07-28 01:12:51

标签: mysql nhibernate hibernate

我有以下表格。

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)
);

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

我看了http://docs.jboss.org/hibernate/core/3.3/reference/en/html/mapping.html#mapping-declaration-onetoone,但我似乎并不理解。

1 个答案:

答案 0 :(得分:2)

实际上很难说,我不知道你想在对象层面代表什么:它是一对一的外键关联吗?多对一的关联?是双向关联?使用ORM意味着比表更多地考虑对象,它通常有助于提供对象模型。

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

  

7.1.2一对一外键关联

     

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

     

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

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

XML中的映射元素   关联是<many-to-one> - 不是   <one-to-one>,就像你可能拥有的一样   预期。原因很简单:你   不关心目标方面的内容   协会,所以你可以治疗   它就像没有的到一个关联   很多部分。你想要的只是   表示“该实体有财产   这是对实例的引用   另一个实体“并使用外键   字段来表示这种关系。   此映射的数据库架构   如图7.3所示。

     

alt text

     

图7.3一对一的外国人   USERSADDRESS之间的关键关联   SHIPPING_ADDRESS_ID

     

附加约束强制执行此操作   作为一对一的真实关系。通过   制作HOME_ADDRESS_ID   列唯一,你声明一个   可以引用特定地址   至多一个用户,作为运输   地址。这并不像   从共享主键保证   协会,允许一个特定的   最多引用的地址   一个用户,期间。有几个外国人   关键栏(假设你也有   唯一的BILLING_ADDRESS_ID和   <many-to-one>),你可以   引用相同的地址目标行   几次。但无论如何,两个   用户无法共享相同的地址   同样的目的。

     

让我们来自User   解决双向问题。

     

反向属性引用

     

最后一个外键关联是   从用户映射到地址   <one-to-one>和一个独特的   约束以保证所需   多重性。什么映射元素可以   你在地址方面添加了   这种关联是双向的,所以   从地址到用户的访问是   可能在Java域模型中?

     

在XML中,您创建了<one-to-one name="user" class="User" property-ref="shippingAddress"/>   使用属性引用进行映射   属性:

anAddress.getUser()
     

你告诉Hibernate该用户   Address类的属性是   另一个属性的倒数   协会的一面。你现在可以   致电{{1}}进行访问   您的送货地址的用户   给出。没有其他专栏   或外键约束;过冬   为你管理这个指针。

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