Hibernate 使用主键的一对一映射

Hibernate 使用主键的一对一映射,hibernate,orm,mapping,Hibernate,Orm,Mapping,我有两个简单的表:Item和ItemDetail 表项具有以下列:id、名称 表ItemDetail有以下列:itemId、颜色、大小 没有项目,ItemDetail永远不存在。项目可以不包含任何ItemDetail而存在。每个项目最多有一个ItemDetail 在hibernate中如何正确映射这种情况 到目前为止,我只找到了以下解决方案: <class name="Item" table="Item"> <id name="id" column="id">

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

表项具有以下列:id、名称

表ItemDetail有以下列:itemId、颜色、大小

没有项目,ItemDetail永远不存在。项目可以不包含任何ItemDetail而存在。每个项目最多有一个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>
我认为,从OOP的角度来看,如果object ItemDetail知道任何关于Item的信息,这是不正确的。这意味着它不应该有属性itemId和item。即使我们同意ItemDetail知道Item是正确的,但它有两个对Item的引用仍然是错误的——一个使用属性itemId,一个使用属性ItemDetail。然后很容易发生这两个属性不同步的情况。这是对不同于属性项的项的itemId引用。为了避免这种情况,我们需要在每次决定将项目设置为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;
}