Что такое "сторона владения" в отображении ORM?



Что именно владея сторону в смысле? Что такое объяснение с некоторыми примерами отображения (один ко многим, один к одному, многие к одному)?



следующий текст представляет собой отрывок из описания @OneToOne в документации Java EE 6. Вы можете увидеть концепцию владея сторону в нем.




определяет однозначную ассоциацию к
другой объект, который имеет один к одному
множественность. Это не нормально
необходимо указать связанные
целевая сущность явно, так как она может
обычно выводится из типа
объекта. Если
отношения являются двунаправленными,в
не владеющая сторона
должен использовать mappedBy
элемент аннотации OneToOne к
укажите поле связи или
собственность стороны-собственника.


812   2  

2 ответов:

вы можете себе представить, что владея сторону это сущность, которая имеет ссылку на другой. В вашем отрывке у вас есть отношения один-к-одному. Так как это симметричного отношение, вы в конечном итоге получите, что если объект A находится в отношении объекта B, то и наоборот верно.

Это означает, что сохранение в объекте A ссылки на объект B и сохранение в объекте B ссылки на объект A будет избыточным: вот почему вы выбираете, какой объект "владеет" другим, имеющим на него ссылку.

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

для отношения "многие ко многим", так как вам понадобится отдельная таблица сопоставления во всяком случае, никакой стороны-собственника не будет.

В заключение владея сторону это сущность, которая имеет ссылку на другой.

почему понятие владеющей стороны необходимо:

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

в чем причина названия 'владеющая сторона'?

владеющая сторона отношения, отслеживаемого Hibernate, является стороной из отношения, что принадлежит внешний ключ в базе данных.

в чем проблема, которую решает понятие собственной стороны?

возьмем пример двух объектов, сопоставленных без объявление стороны-владельца:

@Entity
@Table(name="PERSONS")
public class Person {
    @OneToMany
    private List<IdDocument>  idDocuments;
}

@Entity
@Table(name="ID_DOCUMENTS")
public class IdDocument {
    @ManyToOne
    private Person person;
}

С точки зрения ОО это отображение определяет не одно двунаправленное отношение, а два отдельные однонаправленные отношения.

отображение создаст не только таблицы PERSONS и ID_DOCUMENTS, но также создаст третью таблицу ассоциаций PERSONS_ID_DOCUMENTS:

CREATE TABLE PERSONS_ID_DOCUMENTS
(
  persons_id bigint NOT NULL,
  id_documents_id bigint NOT NULL,
  CONSTRAINT fk_persons FOREIGN KEY (persons_id) REFERENCES persons (id),
  CONSTRAINT fk_docs FOREIGN KEY (id_documents_id) REFERENCES id_documents (id),
  CONSTRAINT pk UNIQUE (id_documents_id)
)

обратите внимание на первичный ключ pk on ID_DOCUMENTS только. В этом случае Hibernate отслеживает обе стороны отношения независимо: если вы добавляете документ в отношение Person.idDocuments, он вставляет запись в таблицу ассоциаций PERSON_ID_DOCUMENTS.

С другой стороны, если мы называем idDocument.setPerson(person), мы меняем внешний ключ person_id на table ID_DOCUMENTS. Гибернация создания два однонаправленные (внешний ключ) отношения в базе данных, чтобы реализовать один двунаправленное объектное отношение.

как понятие собственной стороны решает проблему:

много раз, что мы хотим-это только внешний ключ на таблице ID_DOCUMENTS в направлении PERSONSи дополнительная таблица ассоциаций.

чтобы решить эту проблему, нам нужно настроить Hibernate, чтобы остановить отслеживание изменений на relation Person.idDocuments. Зимовать следует только отслеживать другое сторона отношения IdDocument.person, и для этого мы добавляем mappedBy:

@OneToMany(mappedBy="person")
private List<IdDocument>  idDocuments;

что это значит mappedBy ?

это означает что-то вроде: "модификации на этой стороне отношения уже Отображается другая сторона отношения IdDocument.человек, так что не надо отслеживать его здесь отдельно в дополнительной таблице."

Are есть какие-то готы, последствия?

используя mappedBy, если мы просто называем person.getDocuments().add(document), внешний ключ в ID_DOCUMENTS будет не быть связанным с новым документом, потому что это не является владельцем /отслеживаемой стороной отношения!

чтобы связать документ с новым человеком, вам нужно явно вызвать document.setPerson(person), потому что владея сторону отношения.

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

Comments

    Ничего не найдено.