Гибернация родительско-дочернего отображения - PullRequest
0 голосов
/ 13 сентября 2011

Я пытаюсь отобразить заказ и его элементы в Hibernate.Элемент заказа не должен ссылаться на его родительский заказ:

public class Order {
    private long id;
    private Set<OrderIter> orderItems = new HashSet<OrderItem>();

    public long id() {
        return id;
    }

    public void add(OrderItem item) {
        item.setItemNumber(orderItems.size() + 1);
        orderItems.add(item);
    }

    public Set<OrderItem> orderItems() {
        return Sets.newHashSet(orderItems);
    }
}


public class OrderItem {
    private int itemNumber;

    public int itemNumber() {
        return itemNumber;
    }

    public void setItemNumber(int itemNumber) {
        this.itemNumber = itemNumber;
    }
}

Цель состоит в том, чтобы Hibernate автоматически сохранял элемент заказа при добавлении в заказ, например:

Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();


Order order = (Order) session.load(Order.class, orderId);
OrderItem item = new OrderItem();
order.add(item);

// Done

session.getTransaction().commit();
HibernateUtil.getSessionFactory().close();

Я посмотрел на Глава 24. Пример: Parent / Child , но в этом примере дочерний элемент имеет ссылку на родителя.Сейчас я пытаюсь отобразить его, используя Коллекции зависимых объектов :

<class name="Order" table="ORDERS">
    <id name="id" column="ORDER_ID" access="field">
        <generator class="native" />
    </id>

    <set name="orders" table="ORDER_ITEMS" access="field">
        <key column="id" />
        <composite-element class="OrderItem">
            <property name="ItemNumber" access="field" />
        </composite-element>
    </set>
</class>

Это почти работает, но комбинация идентификатора заказа и номера элемента должна быть уникальной.Как я могу соответствовать всем этим критериям с отображением Hibernate?

1 Ответ

1 голос
/ 13 сентября 2011

Здесь связь один-ко-многим между Order-> OrderItem отображается с использованием JOIN TABLE.Ассоциация «один ко многим» сопоставляется с «многие ко многим» с уникальным значением «истина».(поскольку один-ко-многим не известно о таблице соединения на наборе)

   <class name="Order" table="ORDERS">
        <set name="orders" table="ORDER_ORDERITEMS_RT">
            <key column="ORDER_ID" />
            <many-to-many name="OrderItem" unique="true" column="ORDERITEM_ID"/>
        </set>
    </class>

    <class name="OrderItem table="ORDERITEMS">

    </class>

Приведенное выше сопоставление удовлетворяет

  1. OrderItem, не имеющему ссылку на Order.Поскольку отображение находится в отдельной таблице
  2. Ассоциация «один ко многим» делает пару «orderid-orderitemid» уникальной.
  3. Вы можете поместить в набор соответствующий каскад, чтобы разрешить сохранение элемента orderItem при добавлении всписок на Заказ.(Не показано в отображении)

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...