В этом примере вы узнаете, как отображать компоненты, используя аннотации Hibernate. Рассмотрим следующие отношения между учеником и объектом Address .
Согласно отношениям у каждого студента должен быть уникальный адрес.
Поскольку сущности Student и Address тесно связаны (композиционные отношения), лучше хранить их в одной таблице. Реляционная модель показана ниже.
Студенческий класс используется для создания таблицы СТУДЕНТ .
package com.vaannila.student; import javax.persistence.Column; import javax.persistence.Embedded; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table; @Entity @Table(name = "STUDENT") public class Student { private long studentId; private String studentName; private Address studentAddress; public Student() { } public Student(String studentName, Address studentAddress) { this.studentName = studentName; this.studentAddress = studentAddress; } @Id @GeneratedValue @Column(name = "STUDENT_ID") public long getStudentId() { return this.studentId; } public void setStudentId(long studentId) { this.studentId = studentId; } @Column(name = "STUDENT_NAME", nullable = false, length = 100) public String getStudentName() { return this.studentName; } public void setStudentName(String studentName) { this.studentName = studentName; } @Embedded public Address getStudentAddress() { return this.studentAddress; } public void setStudentAddress(Address studentAddress) { this.studentAddress = studentAddress; } }
@Embedded аннотации используются для указания адреса лица должно храниться в СТУДЕНТЕ таблице в качестве компонента.
@Embeddable аннотация используется для указания, что класс Address будет использоваться в качестве компонента. Класс Address не может иметь собственный первичный ключ, он использует первичный ключ включающего класса.
package com.vaannila.student; import javax.persistence.Column; import javax.persistence.Embeddable; @Embeddable public class Address { private String street; private String city; private String state; private String zipcode; public Address() { } public Address(String street, String city, String state, String zipcode) { this.street = street; this.city = city; this.state = state; this.zipcode = zipcode; } @Column(name = "ADDRESS_STREET", nullable = false, length=250) public String getStreet() { return this.street; } public void setStreet(String street) { this.street = street; } @Column(name = "ADDRESS_CITY", nullable = false, length=50) public String getCity() { return this.city; } public void setCity(String city) { this.city = city; } @Column(name = "ADDRESS_STATE", nullable = false, length=50) public String getState() { return this.state; } public void setState(String state) { this.state = state; } @Column(name = "ADDRESS_ZIPCODE", nullable = false, length=10) public String getZipcode() { return this.zipcode; } public void setZipcode(String zipcode) { this.zipcode = zipcode; } }
Теперь создайте файл конфигурации Hibernate и добавьте классы Student и Address .
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="hibernate.connection.driver_class"> org.hsqldb.jdbcDriver</property> <property name="hibernate.connection.url"> jdbc:hsqldb:hsql://localhost</property> <property name="hibernate.connection.username">sa</property> <property name="connection.password"></property> <property name="connection.pool_size">1</property> <property name="hibernate.dialect"> org.hibernate.dialect.HSQLDialect</property> <property name="show_sql">true</property> <property name="hbm2ddl.auto">create-drop</property> <mapping class="com.vaannila.student.Student" /> <mapping class="com.vaannila.student.Address" /> </session-factory> </hibernate-configuration>
Создайте класс Main для запуска примера.
package com.vaannila.student; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.Transaction; import com.vaannila.util.HibernateUtil; public class Main { public static void main(String[] args) { Session session = HibernateUtil.getSessionFactory().openSession(); Transaction transaction = null; try { transaction = session.beginTransaction(); Address address = new Address("OMR Road", "Chennai", "TN", "600097"); Student student = new Student("Eswar", address); session.save(student); transaction.commit(); } catch (HibernateException e) { transaction.rollback(); e.printStackTrace(); } finally { session.close(); } } }
При выполнении класса Main вы увидите следующий вывод.
У каждого учащегося есть один адрес, а значения хранятся в одной таблице STUDENT .
Структура папок примера показана ниже.
Вы можете скачать исходный код этого примера здесь.