2015-09-07 92 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映射文档。