# @JoinTable跟@JoinColumn到底怎麼用?inserseJoinColumns? ###### tags: `Hibernate`,`Shannon` 補充: 更多annotation https://www.itread01.com/content/1549646648.html # JoinColumn vs JoinTable差別 joinColumn是透過FK來進行連接 JoinTable是將彼此的id獨立出來進行連接 # JoinColumn的使用時機 如果有一個實體叫做`outfit`,其中`@ManyToOne`關聯上`designer`,這時候`@JoinColumn`會在目標實體表(像是`designer_Id`)定義目標表的foreign key。 ```java @Entity public class outfit{ private Long id; @ManyToOne @JoinColumn(name="B_ID") private Designer designer; } ``` # JoinTable的使用時機 這個比較特別,Outfit跟Designer都沒有foreign key,而是透過一個單獨的表(outfit_designer)來保存outfit跟designer的關係。 ```java @Entity public class Outfit{ private Long id; @ManyToOne @JoinTable( name="outfit_designer", joinColumns = @JoinColumn(name = "designer_Id"), inverseJoinColumns = @JoinColumn(name = "outfit_Id") ) private Designer designer; } ``` # JoinTable VS. JoinColumn * JoinTable * 他將兩張表的id儲存到一個單獨的表中 * 更正規畫的資料庫,為default * JoinColumn * 將另一個表的id存在一個新的row * 有更好的性能,因為不需要很多表 # 當joinTable與JoinColumn混用的時候 ```java @Entity public class Employee { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Nationalized private String name; //1. ElementCollection @ElementCollection(fetch = FetchType.EAGER) @Column @Enumerated(EnumType.STRING) @Cascade(org.hibernate.annotations.CascadeType.ALL) @JoinTable(name = "employee_skills", joinColumns = @JoinColumn(name = "employee_id")) private Set<EmployeeSkill> skills; // private Set<DayOfWeek> daysAvailable; public Employee(){} public Employee(String name, Set<EmployeeSkill> skill){ this.name = name; this.skills = skill; } ``` # joinColumns ? inverseJoinColumns? 何時會需要? 有時候你會發現`@JoinTable`裡面有兩個屬性,分別是joinColumns以及inverseJoinColumns,那這兩個到底是甚麼意思呢? 甚麼時候會用到呢? ## joinColumns 如果你有一個employee的Table,他裡面有寫員工的phone_numbers,我們想要製作出兩張表,一張是employee的,一張是phone_number專門用來放員工的電話號碼,一個員工可能會有多個電話號碼。 ```java @JoinTable( name="Employee_Phone", joinColumns = @JoinColumn(name="Employee_id", referencedColumnName="ID") ) ``` ## inverseJoinColumns 如果你有一個employee的table跟專門放phone的table,中間我想要透過一個Table去連接這兩個table,而中間這個Table的名稱employee_phone。 ```java @JoinTable( name="Employee_Phone", joinColumns = @JoinColumn(name="Employee_id", referencedColumnName="ID", inverseJoinColumns = @JoinColumn(name="Phone_id", referencedColumnName="ID")) ) ```