Отображение один в один с использованием первичного ключа - PullRequest
1 голос
/ 30 сентября 2011

У меня есть две простые таблицы: Item и ItemDetail

Элемент таблицы имеет следующие столбцы: идентификатор, имя

Таблица ItemDetail имеет следующие столбцы: itemId, color, size

ItemDetail никогда не существует без Item. Предмет может существовать без какого-либо ItemDetail. Для каждого предмета есть не более одного ItemDetail.

Как правильно отобразить эту ситуацию в спящем режиме?

Пока я нашел только следующее решение:

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

Я думаю, что с точки зрения ООП неправильно, если объект ItemDetail знает что-нибудь о Item. Это означает, что у него не должно быть свойств itemId и item. Даже если мы согласились с тем, что правильно, если ItemDetail знает о Item, все равно неправильно, что у него есть две ссылки на Item - одна с использованием свойства itemId и одна с использованием свойства itemDetail. Тогда очень легко может случиться, что эти два свойства не синхронизированы. То есть itemId ссылается на Item, отличный от элемента item. Чтобы избежать этого, нам нужно обновлять itemId и item каждый раз, когда мы решаем установить Item для ItemDetail.

Есть ли другое решение, которое не имеет этих недостатков?

Спасибо

...