我有两个简单的表: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。
还有其他解决方案没有这些缺点吗?
谢谢