Разлика между @JoinColumn и mappedBy

1. Въведение

Връзките на JPA могат да бъдат еднопосочни или двупосочни. Това просто означава, че можем да ги моделираме като атрибут точно на един от асоциираните обекти или и на двата.

Дефинирането на посоката на връзката между обектите не оказва влияние върху картографирането на базата данни. Той само определя посоките, в които използваме тази връзка в нашия домейн модел.

За двупосочна връзка обикновено дефинираме:

  • притежаващата страна
  • обратна или референтната страна

В @JoinColumn анотация ни помага да определите колоната ще използваме за присъединяване към сдружение лице или събиране елемент. От друга страна, атрибутът mappedBy се използва за дефиниране на референтната страна ( несобствената страна) на връзката.

В този бърз урок ще разгледаме разликата между @JoinColumn и mappedBy в JPA. Ще представим и как да ги използваме в асоциация „един към много“.

2. Първоначална настройка

За да продължим заедно с този урок, да кажем, че имаме две обекти: Служител и Имейл.

Ясно е, че служителят може да има множество имейл адреси. Даден имейл адрес обаче може да принадлежи точно на един служител.

Това означава, че те споделят асоциация един към много:

Също така в нашия модел RDBMS ще имаме външен ключ worker_id в нашия имейл обект, отнасящ се до атрибута id на служител .

3. Анотация на @JoinColumn

В отношенията един към много / много към един, притежаващата страна обикновено се определя от страната " много" на връзката. Обикновено страната е тази, която притежава външния ключ.

На @JoinColumn дефинира пояснение, че действителната физическа карта за този притежаване страна:

@Entity public class Email { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "employee_id") private Employee employee; // ... }

Това просто означава, че нашият имейл обект ще има колона с външен ключ, наречена worker_id, отнасяща се до идентификатора на основния атрибут на нашата същност на служителя .

4. mappedBy Атрибут

След като дефинираме собствената страна на връзката, Hibernate вече разполага с цялата необходима информация за картографиране на тази връзка в нашата база данни. За да направим тази асоциация двупосочна, всичко, което трябва да направим, е да дефинираме референтната страна. Обратната или референтната страна просто се преобразува в притежаващата страна.

Лесно можем да използваме mappedBy атрибут на @OneToMany анотация да го направят. И така, нека дефинираме нашия обект на служител :

@Entity public class Employee { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; @OneToMany(fetch = FetchType.LAZY, mappedBy = "employee") private List emails; // ... }

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

5. Заключение

В този урок разгледахме разликата между @JoinColumn и mappedBy и как да ги използваме в двупосочна връзка едно към много.

В @JoinColumn анотацията определя действителната физическите канали за притежаване страна. От друга страна, съотнасяне страна, се определя по mappedBy атрибут на @OneToMany анотацията.

Както обикновено, изходният код е достъпен в Github.