Отношения между Java-объектами и таблицами базы данных Один-ко-многим.
Существует три вида отношений между таблицами реляционных баз данных:
Отношения Один-ко-многим - наиболее распространенный вид отношений .
Практическим примером таких отношений могут служить такие пары сущностей, как
Существует три вида отношений между таблицами реляционных баз данных:
- One-to-One,
- One-to-Many / Many-to-One,
- Many-to-Many.
Отношения Один-ко-многим - наиболее распространенный вид отношений .
Практическим примером таких отношений могут служить такие пары сущностей, как
- Наниматель (один) - Работник (много);
- Покупатель (один) - Товар (много);
- Курс (один) - Студент (много);
- Адрес (один) - Студент (много), т.е. по одному адресу могу проживать не менее одного студента, а каждый студент имеет только один адрес проживания:
или в виде таблиц БД:
Такого рода отношения в Hibernate обозначаются аннотациями @ManyToOne или @OneToMany, в зависимости от Java-класса, описывающего сущность, в котором они применяются.
Помимо этого, все отношения в Hibernate могут быть однонаправленными (Unidirectional) и двунаправленными (Bidirectional).
Посмотрим на примере.
Создадим два Java-класса, которые объявим сущностями Hibernate с помощью аннотации @Entity. А также поля, используемые для идентификации этих сущностей, и сопоставленные со столбцами соответствующих таблиц при помощи аннотаций @Id и @GeneratedValue.
Кроме того, в классе Student объявлена переменная address класса Address.
При создании экземпляров данных классов, в объектах класса Student можно получить его адрес проживания из переменной address класса Address.
Но из экземпляра класса Address невозможно получить данные о студентах, проживающих по адресу, связанному с данным экземпляром класса.
Данная связь называется однонаправленной (Unidirectional).
Для дальнейшего понимания отношений определим концепцию Родительской (Parent) и Дочерней (Child) таблиц.
В случае отношения Один-ко-Многим, дочерней называется таблица, содержащая внешний ключ.
В данном примере это таблица студентов, а внешний ключ - ссылка на таблицу адресов.
В нашем примере, в классе Student:
Использование данной аннотации необходимо для создания Hibernate необходимого внешнего ключа в дочерней таблице Student.
Дополнительно эта аннотация может содержать параметры, описывающий поведение БД при удалении и/или вставке значений в связанные поля, например:
Если прикладная реализация требует получения не только адреса проживания каждого студента, но и всех студентов, проживающих по определенному адресу, то используется двунаправленная связь.
Для обозначения двунаправленной (Bidirectional) связи в Hibernate определена вторая аннотация: @OneToMany, в дополнение к аннотации @ManyToOne.
При отношении Один-ко-Многим для объекта, соответствующего дочерней таблице БД (со стороны "Многие"), используется аннотация @ManyToOne для соответствующего геттера.
А для объекта, соответствующего родительской таблице БД (со стороны "Один"), - аннотация @OneToMany для соответствующего геттера.
(где "address" - это имя переменной дочернего класса, отмеченная аннотацией @ManyToOne в данной связи)
Посмотрим на примере.
Создадим два Java-класса, которые объявим сущностями Hibernate с помощью аннотации @Entity. А также поля, используемые для идентификации этих сущностей, и сопоставленные со столбцами соответствующих таблиц при помощи аннотаций @Id и @GeneratedValue.
Кроме того, в классе Student объявлена переменная address класса Address.
Address.java
- import javax.persistence.Entity;
- import javax.persistence.GeneratedValue;
- import javax.persistence.GenerationType;
- import javax.persistence.Id;
- @Entity
- public class Address {
- private Long id;
- private String address;
- @Id
- @GeneratedValue(strategy=GenerationType.AUTO)
- public Long getId() {
- return id;
- }
- public void setId(Long id) {
- this.id = id;
- }
- public String getAddress() {
- return address;
- }
- public void setAddress(String address) {
- this.address = address;
- }
- }
Student.java
- import javax.persistence.Entity;
- import javax.persistence.GeneratedValue;
- import javax.persistence.GenerationType;
- import javax.persistence.Id;
- @Entity
- public class Student {
- private Long id;
- private String studentName;
- private Address address;
- @Id
- @GeneratedValue(strategy=GenerationType.AUTO)
- public Long getId() {
- return id;
- }
- public void setId(Long id) {
- this.id = id;
- }
- public String getStudentName() {
- return studentName;
- }
- public void setStudentName(String studentName) {
- this.studentName = studentName;
- }
- public Address getAddress() {
- return address;
- }
- public void setAddress(Address address) {
- this.address = address;
- }
- }
При создании экземпляров данных классов, в объектах класса Student можно получить его адрес проживания из переменной address класса Address.
Но из экземпляра класса Address невозможно получить данные о студентах, проживающих по адресу, связанному с данным экземпляром класса.
Данная связь называется однонаправленной (Unidirectional).
Для дальнейшего понимания отношений определим концепцию Родительской (Parent) и Дочерней (Child) таблиц.
В случае отношения Один-ко-Многим, дочерней называется таблица, содержащая внешний ключ.
В данном примере это таблица студентов, а внешний ключ - ссылка на таблицу адресов.
Проще говоря, дочерней таблицей при отношении Один-ко-Многим, является таблица, отражающая сущности "Многих"Для реализации однонаправленной (Unidirectional) связи Один-ко-Многим достаточно использования аннотации @ManyToOne в объекте, соответствующему дочерней таблице в БД.
В нашем примере, в классе Student:
- @ManyToOne
- public Address getAddress() {
- return address;
- }
Использование данной аннотации необходимо для создания Hibernate необходимого внешнего ключа в дочерней таблице Student.
Дополнительно эта аннотация может содержать параметры, описывающий поведение БД при удалении и/или вставке значений в связанные поля, например:
- @ManyToOne(cascade = CascadeType.ALL)
- public Address getAddress() {
- return address;
- }
Если прикладная реализация требует получения не только адреса проживания каждого студента, но и всех студентов, проживающих по определенному адресу, то используется двунаправленная связь.
Для обозначения двунаправленной (Bidirectional) связи в Hibernate определена вторая аннотация: @OneToMany, в дополнение к аннотации @ManyToOne.
При отношении Один-ко-Многим для объекта, соответствующего дочерней таблице БД (со стороны "Многие"), используется аннотация @ManyToOne для соответствующего геттера.
А для объекта, соответствующего родительской таблице БД (со стороны "Один"), - аннотация @OneToMany для соответствующего геттера.
В случае двунаправленной (Bidirectional) связи необходимо дополнительно создать переменную родительского класса, которая позволит хранить коллекцию объектов дочернего класса. А так же связать геттер этой переменной с переменной дочернего класса, хранящую родительский объект, при помощью аннотации @OneToMany(mappedBy="address").
Для запоминания: на стороне "Многие" аннотация @ManyToOne, а на стороне "Один" - @OneToMany
(где "address" - это имя переменной дочернего класса, отмеченная аннотацией @ManyToOne в данной связи)
- import javax.persistence.Entity;
- import javax.persistence.GeneratedValue;
- import javax.persistence.GenerationType;
- import javax.persistence.Id;
- @Entity
- public class Address {
- private Long id;
- private String address;
- private Set<Student> studentSet;
- @Id
- @GeneratedValue(strategy=GenerationType.AUTO)
- public Long getId() {
- return id;
- }
- public void setId(Long id) {
- this.id = id;
- }
- public String getAddress() {
- return address;
- }
- public void setAddress(String address) {
- this.address = address;
- }
- @OneToMany(cascade=CascadeType.ALL, mappedBy="address")
- public Set<Student> getStudentSet() {
- return studentSet;
- }
- public void setStudentSet(Set<Student> studentSet) {
- this.studentSet = studentSet;
- }
- }
Комментариев нет :
Отправить комментарий