Hibernate JPA Аннотации от 1 до 0..1 отношения - PullRequest
1 голос
/ 27 октября 2011

Я пытаюсь установить отношение 1to0..1 (ноль или один), но сталкиваюсь с проблемами.

Теперь я предполагаю использовать @OneToMany, а не @ OneToOne.

По сути, я хочу, чтобы моя таблица «child» содержала внешний ключ для «parent» (я использую child и parent очень свободно).Мне никогда не нужно загружать "дочерние" автономные

Это базовая структура таблиц, которую я хочу достичь

ITEM {
  ID
  RELATED_ITEM_ID
}

INVOICE {
  ID
}
CATALOGUE {
  ID
}

Представлено как классы Java, подобные следующим

class Item {
...
}

class Invoice {
  @OneToMany(fetch=FetchType.EAGER, orphanRemoval = true, cascade = { javax.persistence.CascadeType.ALL })
  @Fetch(FetchMode.JOIN)
  @JoinColumn(name="RELATED_ITEM_ID", nullable=false)
  Set<Item> items;
}

class Catalogue {
  @OneToMany(fetch=FetchType.EAGER, orphanRemoval = true, cascade = { javax.persistence.CascadeType.ALL })
  @Fetch(FetchMode.JOIN)
  @JoinColumn(name="RELATED_ITEM_ID", nullable=false)
  Set<Item> items;
}

Приведенный выше код, если у меня есть только Invoice или Catalog, зарегистрированный в hibernate, создаст таблицы так, как я хочу, и будет работать отлично.Однако, как только я зарегистрировал Инвойс и Каталог, Hibernate выдает ошибку

org.hibernate.MappingException: Duplicate property mapping of _itemsBackref found in package.name.Item

Ответы [ 2 ]

0 голосов
/ 27 октября 2011

Я в конечном итоге обманул, чтобы заставить это работать так, как я хочу.В идеале я не хочу такой иерархии, но мне нужно, чтобы это работало, и я чувствую, что это компромисс с работой вокруг hibernate.

ITEM {
  ID
  RELATED_ITEM_ID
  DTYPE
}

INVOICE {
  ID
}

CATALOGUE {
  ID
}

Представлено как классы Java, подобные следующим

@Entity
@Table(name="RECIPIENTS")
abstract class Item {
  ...
}

@Entity
  public class InvoiceItem extends Item {
}

@Entity
  public class CatalogueItem extends Item {
}


class Invoice {
  @OneToMany(fetch=FetchType.EAGER, orphanRemoval = true, cascade = { javax.persistence.CascadeType.ALL })
  @Fetch(FetchMode.JOIN)
  @JoinColumn(name="RELATED_ITEM_ID", nullable=false)
  Set<InvoiceItem> items;
}

class Catalogue {
  @OneToMany(fetch=FetchType.EAGER, orphanRemoval = true, cascade = { javax.persistence.CascadeType.ALL })
  @Fetch(FetchMode.JOIN)
  @JoinColumn(name="RELATED_ITEM_ID", nullable=false)
  Set<CatalogueItem> items;
}
0 голосов
/ 27 октября 2011

Я не думаю, что можно сопоставить эту схему с Hibernate (по крайней мере, если Customer и Recepient не расширяют одну и ту же сущность).

Было бы намного проще использовать следующую схему:

ADDRESSES {
  ID
}

CUSTOMER {
  ID
  ADDRESS_ID
}
RECIPIENT {
  ID
  ADDRESS_ID
}
<Ч />
class Customer {
  @OneToOne(fetch=FetchType.EAGER, orphanRemoval = true, cascade = { javax.persistence.CascadeType.ALL })
  @Fetch(FetchMode.JOIN)
  @JoinColumn(name="ADDRESS_ID")
  Address address;
}

class Recipient {
  @OneToOne(fetch=FetchType.EAGER, orphanRemoval = true, cascade = { javax.persistence.CascadeType.ALL })
  @Fetch(FetchMode.JOIN)
  @JoinColumn(name="ADDRESS_ID")
  Address address;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...