2015-09-07 121 views
2

我對@JoinColumn和@MappedBy的工作感到困惑。@JoinColumn和@MappedBy如何工作

考慮下面的例子 這裏是我係類單向關係

@Entity 
@Table(name = "DEPARTMENT") 
public class Department { 
    @Id 
    @Column(name = "DEPARTMENT_ID") 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Integer departmentId; 
    @Column(name = "DEPARTMENT_NAME") 
    private String departmentName; 
    @Column(name = "LOCATION") 
    private String location; 

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY) 
    @JoinColumn(name = "DEPARTMENT_ID") 
    private List<Employee> employees = new ArrayList<>(); 
} 

Department class在我所指定@JoinColumn所以它會把department_id FK在employee tablelist of employees

而是雙向的關係,我會定義類,如

Department.java 
@Entity 
@Table(name = "DEPARTMENT") 
public class Department { 
    @Id 
    @Column(name = "DEPARTMENT_ID") 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Integer departmentId; 
    @Column(name = "DEPARTMENT_NAME") 
    private String departmentName; 
    @Column(name = "LOCATION") 
    private String location; 

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "department") 
    private List<Employee> employees = new ArrayList<>(); 
} 

Employee.java 
@Entity 
@Table(name = "EMPLOYEE") 
public class Employee { 
    @Id 
    @SequenceGenerator(name = "emp_seq", sequenceName = "seq_employee") 
    @GeneratedValue(generator = "emp_seq") 
    @Column(name = "EMPLOYEE_ID") 
    private Integer employeeId; 
    @Column(name = "EMPLOYEE_NAME") 
    private String employeeName; 

    @ManyToOne 
    @JoinColumn(name = "DEPARTMENT_ID") 
    private Department department; 
} 

但雙向關係,爲什麼我需要把@JoinColumn超過departmentEmployee classDepartment class寫@MappedBy超過list of employees

更新

那麼@MappedBy和@JoinColumn如何工作?

+0

爲什麼2nd'Department'映射沒有'@ Table'和'@ Entity'註解? –

+0

我忘了複製它。感謝@JordiCastilla注意它。 – eatSleepCode

回答

5

其實,看起來你並沒有使用@MappedBy註釋,而是mappedBy = "department"@OneToMany

簡而言之,mappedBy告訴hibernate關係的關鍵在另一個表(本例中是類)上。

想想這個:通常當你在任何數據庫系統中連接2個表時,只有其中的一個有外鍵約束到另一個對嗎?

什麼MappedBy允許您從不包含約束的錶鏈接到另一個表。

關於@JoinColumn更容易,在這裏你必須在表的外鍵,這樣你就告訴Hibernate這不僅是一列,而是一列,必須加入表。

連接列聲明爲@JoinColumn註釋,看起來像@Column註釋。它還有一個參數名爲referencedColumnName。該參數聲明將用於連接的目標實體中的列。請注意,將referencedColumnName用於非主鍵列時,關聯的類必須是Serializable。還要注意,引用的ColumnName必須映射到具有單個列的屬性(其他情況可能不起作用)。

查找HEREhibernate映射文檔。