# @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"))
)
```