Sahibi olan taraf kavramı neden gereklidir:
İki yönlü bir ilişkinin sahip olduğu taraf fikri, ilişkisel veritabanlarında nesnelerdeki gibi çift yönlü ilişkiler olmadığı gerçeğinden gelir. Veritabanlarında sadece tek yönlü ilişkilerimiz var - yabancı anahtarlar.
'Sahiplenme tarafı' adının nedeni nedir?
Hibernate tarafından izlenen ilişkinin sahibi olan taraf, ilişkinin veritabanında yabancı anahtara sahip olan tarafıdır .
Taraf sahibi olma fikrinin çözdüğü sorun nedir?
Eşlenen iki tarafın bir örneğini ele alalım olmadan bir sahibi tarafını ilan:
@Entity
@Table(name="PERSONS")
public class Person {
@OneToMany
private List<IdDocument> idDocuments;
}
@Entity
@Table(name="ID_DOCUMENTS")
public class IdDocument {
@ManyToOne
private Person person;
}
OO bakış açısına göre, bu eşleme bir çift yönlü ilişkiyi değil, iki ayrı tek yönlü ilişkiyi tanımlar.
Haritalama sadece tablolar yaratacak PERSONS
ve ID_DOCUMENTS
aynı zamanda üçüncü bir bağlantı tablosu yaratacak 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)
)
Birincil anahtar dikkat pk
üzerinde ID_DOCUMENTS
sadece. Bu durumda Hibernate, ilişkinin her iki tarafını bağımsız olarak izler: İlişkiye bir belge eklerseniz Person.idDocuments
, ilişkilendirme tablosuna bir kayıt ekler PERSON_ID_DOCUMENTS
.
Öte yandan idDocument.setPerson(person)
ararsak, masadaki yabancı anahtar person_id'i değiştiririz ID_DOCUMENTS
. Hibernate, iki yönlü bir nesne ilişkisi uygulamak için veritabanında iki tek yönlü (yabancı anahtar) ilişki oluşturuyor.
Tarafa sahip olma kavramı sorunu nasıl çözer:
Çoğu zaman istediğimiz şey sadece masaya ID_DOCUMENTS
doğru bir yabancı anahtar PERSONS
ve ekstra ilişkilendirme tablosu.
Bunu çözmek için, ilgili değişiklikleri izlemeyi durduracak şekilde Hibernate'i yapılandırmamız gerekir Person.idDocuments
. Hazırda bekletme , ilişkinin yalnızca diğer tarafını izlemelidirIdDocument.person
ve bunu yapmak için mappedBy ekleriz :
@OneToMany(mappedBy="person")
private List<IdDocument> idDocuments;
MappedBy ne anlama geliyor?
Gibi bu araçlar bir şey: "ilişkisi bu tarafında değişiklikler zaten vardır eşlenen
gerek ekstra tabloda ayrı buradan takip etmek, böylece ilişki IdDocument.person diğer tarafında."
Herhangi bir GOTCHA, sonuç var mı?
Kullanılması mappedBy biz sadece çağırırsanız, person.getDocuments().add(document)
, yabancı anahtar ID_DOCUMENTS
olacak DEĞİL bu ilişkinin sahip olma / izlenen tarafı olmadığı için, yeni dokümana bağlantı!
Belgeyi yeni kişiye bağlamak için, açıkça aramanız gerekir document.setPerson(person)
, çünkü bu, ilişkinin sahibi olan taraftır .
MappedBy kullanılırken , veri tabanındaki yeni ilişkinin kalıcılığını tetiklemek için sahip olan tarafın ne olduğunu bilmek ve ilişkinin doğru tarafını güncellemek geliştiricinin sorumluluğundadır.