Проблема с родителями / детьми в спящем режиме - PullRequest
0 голосов
/ 15 июля 2010

У меня проблема с отношениями родительского дочернего типа.
В документах Hibernate сказано добавить отношение "многие к одному" в дочернем классе, чтобы получить значение внешнего ключа от родителя.Но чтобы заставить это отношение работать, я должен добавить свойство Invoice в дочерний класс, которое вводит циклическое включение parent в child и нарушает мой сериализатор.Может ли кто-нибудь указать, где я делаю ошибку?

Вот мой код:

Invoice.java

public class Invoice implements Serializable {
  private Long id;
  private Date invDate;
  private String customer;
  private Set<InvoiceItem> items;
  ... getters/setters ...
}

InvoiceItem.java

public class InvoiceItem implements Serializable {
  private Long itemId;
  private long productId;
  private int quantity;
  private double price;
  private Invoice invoice; //???????
  ... getters/setters ...
}

Invoice.hbm.xml

<class name="Invoice" table="Invoices">
  <id name="id" column="ID" type="long">
    <generator class="native" />
  </id>
  <property name="invDate" type="timestamp" />
  <property name="customer" type="string" />

  <set name="items" inverse="true" cascade="all-delete-orphan">
    <key column="invoiceId" />
    <one-to-many class="InvoiceItem" />
  </set>
</class>

InvoiceItem.hbm.xml

<class name="InvoiceItem" table="InvoiceItems">
  <id name="itemId" type="long" column="id">
    <generator class="native" />
  </id>

  <property name="productId" type="long" />
  <property name="quantity" type="int" />
  <property name="price" type="double" />

<many-to-one name="invoiceId" class="Invoice" not-null="true"/> <!--????????-->
</class>

1 Ответ

2 голосов
/ 15 июля 2010

Вам не нужно иметь ссылку на Invoice в InvoiceItem, если вы удалите атрибут inverse = "true".Затем Hibernate создаст отдельную таблицу сопоставления, а не будет использовать внешний ключ в таблице InvoiceItem.

Удалите атрибут inverse в наборе InvoiceItem, а также удалите свойство Invoice из InvoiceItem и соответствующий many-to-one в отображении, и вы должны получить то, что вы хотите.

В качестве альтернативы, вы можете пометить ссылку Invoice в InvoiceItem как переходную и обработать заполнение значения во время десериализации: выполнить итерацию в наборе элементов в Invoice и установитьinvoice свойство каждого элемента в счете-фактуре.

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