使用主键进行一对一映射

时间:2011-09-30 12:10:20

标签: hibernate orm mapping

我有两个简单的表:Item和ItemDetail

表项包含以下列:id,name

表ItemDetail包含以下列:itemId,color,size

如果没有Item,ItemDetail永远不会存在。可以在没有任何ItemDetail的情况下存在Item。对于每个项目,最多只有一个ItemDetail。

如何在hibernate中正确映射这种情况?

到目前为止,我发现只有以下解决方案:

<class name="Item" table="Item">
    <id name="id" column="id">
        <generator class="native"></generator>
    </id>      
    <property name="name" />
    <one-to-one name="itemDetail" class="ItemDetail" cascade="save-update"/>
</class>

<class name="ItemDetail">
    <id name="itemId">
        <generator class="foreign">
            <param name="property">item</param>
        </generator>
    </id>
    <one-to-one name="item" class="Item" constrained="true" />
    <property name="color" />
    <property name="size" /> 
</class>

这个解决方案有效,但我认为它不是“干净”,因为在类ItemDetail中我需要同时拥有itemId和item属性。

private class Item {
  private long id;
  private String name;
  private ItemDetail detail;
}

private class ItemDetail {
  private long itemId;
  private Item item;
  private int color;
  private int size;
}

我认为从OOP的角度来看,如果对象ItemDetail知道有关Item的任何内容,那么它是不正确的。这意味着它不应该具有属性itemId和item。即使我们同意如果ItemDetail知道Item是正确的,它仍然是错误的,它有两个对Item的引用 - 一个使用属性itemId,一个使用属性itemDetail。然后很容易发生这两个属性不同步。这是itemId对属性项的不同Item的引用。为避免这种情况,我们每次决定将Item设置为ItemDetail时都需要更新itemId和item。

还有其他解决方案没有这些缺点吗?

谢谢

0 个答案:

没有答案