我有以下表格。
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,但我似乎并不理解。
答案 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所示。
图7.3一对一的外国人
USERS
和ADDRESS
之间的关键关联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}}进行访问 您的送货地址的用户 给出。没有其他专栏 或外键约束;过冬 为你管理这个指针。
如果您拥有的实际上是一个真正的多对一关联,那么应该很容易适应上述解决方案。