2015-09-07 3 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<>(); 
} 

У меня есть list of employees в Department class, над которым я указанный @JoinColumn так это добавит department_id FK в employee table.

но с двунаправленной связи я определить классы как

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 над department в Employee class и написать @MappedBy над list of employees в Department class?

обновление

так же, как и @MappedBy @JoinColumn работает?

+0

Почему 2-е отображение 'Департамента' не содержит аннотаций '@ Table' и' @ Entity'? –

+0

Я забыл его скопировать. Спасибо @JordiCastilla за это. – eatSleepCode

ответ

5

На самом деле, кажется, вы не используете @MappedBy аннотация, но mappedBy = "department" в @OneToMany.

Простыми словами, mappedBy сообщает hibernate, что ключ отношения находится на другой таблице (класс в этом случае).

Подумайте об этом: Обычно, когда вы связываете 2 таблицы в любой системе БД, только один из них имеет ограничение внешнего ключа на другое право?

MappedBy позволяет ссылаться на таблицу, не содержащую ограничений, на другую таблицу.

О @JoinColumn это проще, здесь у вас есть в таблице внешнего ключа, так что вы говорите зимуют это не только столбец, а столбец, который должен присоединиться к таблице.

столбце соединения объявляется с @JoinColumn аннотацию, которая выглядит как @Column аннотацию. Он имеет еще один параметр с именем referedColumnName. Этот параметр объявляет столбец целевого объекта, который будет использоваться для соединения. Обратите внимание, что при использовании ссылается на имя столбца на столбец не первичного ключа, связанный класс должен быть Serializable. Также обратите внимание, что значение , на которое ссылается имя столбца, в столбец не первичного ключа, должно быть сопоставлено с свойством, имеющим один столбец (другие случаи могут не работать).

Найти HEREhibernate картографические документы.