Двунаправленное сопоставление с использованием только идентификатора на одной стороне

У меня есть два класса, Родитель и Дети

@Entity
class Parent {

     @Id 
     private long id;

     @OneToMany
     private List<Children> children;

}

@Entity
class Children {

      @Id
      private int id;

      @ManyToOne
      private Parent parent; //Normal bi-directional mapping
                   // OR 
      private long parentId; //just keeping reference to parent (kind of bi-directional)
}

Требования

Мне нужен навигационный доступ в обоих направлениях. Но навигационный доступ от дочернего к родительскому не критичен. Он будет использоваться время от времени для выполнения некоторых операций. Навигационный доступ от родителя к дочернему элементу очень важен на прикладном уровне и является частью базовой бизнес-логики.

  1. Имеет ли вообще смысл сохранять здесь двунаправленное отображение?
  2. Если да, то имеет ли смысл хранить только идентификатор родителя в дочернем элементе? Я боюсь сложностей, с которыми я могу столкнуться, если сопоставлю всю родительскую сущность с дочерней.

Насколько я понимаю, сопоставление объекта или просто идентификатора родителя не будет иметь никакого значения в хранилище базы данных, так как в обоих случаях база данных будет хранить для него только один столбец (в качестве внешнего ключа в случае сопоставления объекта и в качестве обычный столбец-parentId в случае сохранения только идентификатора).

Однако я мог бы повысить производительность, если бы явно информировал базу данных о двунаправленной связи между двумя объектами?

PS. Не обращайте внимания на отсутствующие аннотации и другие параметры, чтобы завершить сопоставление синтаксически. Вопрос не в том, «Как я должен», а в том, «Должен ли я»?


person Anmol Gupta    schedule 17.12.2015    source источник


Ответы (1)


Что вы обычно делаете с Hibernate:

Детский.класс

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "parent_id")
private Parent parent;

т.е. присоединяетесь только по id, но сохраняете весь родительский объект соответственно

Родительский.класс

@OneToMany(fetch = FetchType.LAZY, mappedBy = "parent")
private List<Children> children = new ArrayList<Children>();

Чтобы ответить на ваш первый вопрос: да, двунаправленное отображение имеет смысл, потому что связь очевидна.

Редактировать: Хотя сопоставление не идеально, потому что у детей обычно не один родитель, а два. ;)

person LordAnomander    schedule 17.12.2015