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.