Hibernate @OneToOne – Quan hệ một – một

JDBC & Hibernate

Quan hệ 1-1 được dùng cho những trường hợp một bản ghi chỉ cho phép duy nhất một bản ghi khác tham chiếu tới nó.

Ví dụ 1: Trường hợp thừa kế, Student extends Person

Một bản ghi person chỉ được tham chiếu bởi 1 bản ghi student

Code ví dụ Hibernate @OneToOne - Quan hệ một - một

Ví dụ 2: Trường hợp sử dụng chung id, 1 bản ghi item chỉ được tham chiếu bởi 1 bản ghi item_detail,  item và item_detail sẽ có chung giá trị id

Code ví dụ Hibernate @OneToOne - Quan hệ một - một

Trong bài này mình sẽ thực hiện viết code ví dụ cho ví dụ 1.

Tạo database

CREATE SCHEMA `hibernate-demo-6` ; CREATE TABLE `hibernate-demo-6`.`person` ( `id` INT NOT NULL AUTO_INCREMENT, `name` VARCHAR(45) NULL, `address` VARCHAR(45) NULL, PRIMARY KEY (`id`)); CREATE TABLE `hibernate-demo-6`.`student` ( `id` INT NOT NULL AUTO_INCREMENT, `class_name` VARCHAR(45) NULL, `school_name` VARCHAR(45) NULL, `person_id` INT NULL, PRIMARY KEY (`id`), UNIQUE INDEX `person_id_UNIQUE` (`person_id` ASC), CONSTRAINT `student-person` FOREIGN KEY (`person_id`) REFERENCES `hibernate-demo-6`.`person` (`id`));
Code language: JavaScript (javascript)

Các bạn để ý, person_id sẽ là UNIQUE vì mỗi student sẽ tham chiếu tới 1 person riêng biệt nên chúng sẽ không được trùng nhau.

Các công nghệ sử dụng:

Cấu trúc project

Code ví dụ Hibernate @OneToOne - Quan hệ một - một

Các thư viện sử dụng

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>stackjava.com</groupId> <artifactId>HibernateOneToOneExample</artifactId> <version>0.0.1-SNAPSHOT</version> <properties> <maven.compiler.target>1.8</maven.compiler.target> <maven.compiler.source>1.8</maven.compiler.source> <hibernate.version>5.3.6.Final</hibernate.version> </properties> <dependencies> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>${hibernate.version}</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> <version>${hibernate.version}</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.46</version> </dependency> </dependencies> </project>
Code language: HTML, XML (xml)

Cấu hình hibernate, kết nối MySQL

persistence.xml

<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd" version="2.1"> <persistence-unit name="persistence"> <description>Demo Hibernate OneToOne</description> <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> <properties> <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" /> <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/hibernate-demo-6" /> <property name="javax.persistence.jdbc.user" value="root" /> <property name="javax.persistence.jdbc.password" value="admin1234" /> <property name="hibernate.show_sql" value="true" /> </properties> </persistence-unit> </persistence>
Code language: HTML, XML (xml)

Trong ví dụ này mình sử dụng entityManager nên sẽ khai báo file persistence.xml nếu các bạn sử dụng hibernateSession thì có thể khai báo file hibernate.cfg.xml

Các file entities

Person.java

package stackjava.com.hibernatedemo.entities; import javax.persistence.*; @Entity @Table(name = "person") public class Person { @Id @Column(name = "id") @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; @Column(name = "name") private String name; @Column(name = "address") private String address; @Override public String toString() { return "Person [id=" + id + ", name=" + name + ", address=" + address + "]"; } // getter - setter }
Code language: PHP (php)

Student.java

package stackjava.com.hibernatedemo.entities; import javax.persistence.*; @Entity @Table(name = "student") public class Student { @Id @Column(name = "id") @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; @Column(name = "class_name") private String className; @Column(name = "school_name") private String schoolName; @OneToOne @JoinColumn(name = "person_id", nullable = false) private Person person; @Override public String toString() { return "Student [id=" + id + ", className=" + className + ", schoolName=" + schoolName + "]"; } // setter - getter }
Code language: PHP (php)
  • Annotation @OneToOne biểu thị mối quan hệ 1 – 1
  • @JoinColumn(name = "person_id") biểu thị rằng 2 đối tượng mapping qua column person_id Trường hợp dùng chung id thì ta thay bằng annotation @PrimaryKeyJoinColumn

Demo 1

Insert 1 đối tượng person và 1 đối tượng student.

DemoInsert.java

package stackjava.com.hibernatedemo; import javax.persistence.*; import stackjava.com.hibernatedemo.entities.*; public class DemoInsert { public static void main(String[] args) { EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("persistence"); EntityManager entityManager = entityManagerFactory.createEntityManager(); entityManager.getTransaction().begin(); Person person = new Person("kai", "ha noi - viet nam"); Student student = new Student("D11CN2", "PTIT"); student.setPerson(person); entityManager.persist(person); entityManager.persist(student); // Student student2 = new Student("DXXXX1", "FTU"); // student2.setPerson(person); // entityManager.persist(student2); entityManager.getTransaction().commit(); System.out.println("--------- after insert -------------"); System.out.println(person); System.out.println(student); entityManager.close(); entityManagerFactory.close(); } }
Code language: JavaScript (javascript)
Kết quả:
Hibernate: insert into person (address, name) values (?, ?) Hibernate: insert into student (class_name, person_id, school_name) values (?, ?, ?) --------- after insert ------------- Person [id=1, name=kai, address=ha noi - viet nam] Student [id=1, className=D11CN2, schoolName=PTIT]
Code language: CSS (css)

Trong class trên, nếu bạn comment phần tạo và insert student2 nó sẽ xảy ra lỗi ConstraintViolationException ví có tới 2 đối tượng student tham chiếu tới 1 đối tượng person

Demo 2

Select đối tượng 1-1

DemoSelect.java

package stackjava.com.hibernatedemo; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; import stackjava.com.hibernatedemo.entities.Student; public class DemoSelect { public static void main(String[] args) { EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("persistence"); EntityManager entityManager = entityManagerFactory.createEntityManager(); entityManager.getTransaction().begin(); Student student= entityManager.find(Student.class, 1); System.out.println(student); System.out.println(student.getPerson()); entityManager.getTransaction().commit(); entityManager.close(); entityManagerFactory.close(); } }
Code language: JavaScript (javascript)

Kết quả:

Hibernate: select student0_.id as id1_1_0_, student0_.class_name as class_na2_1_0_, student0_.person_id as person_i4_1_0_, student0_.school_name as school_n3_1_0_, person1_.id as id1_0_1_, person1_.address as address2_0_1_, person1_.name as name3_0_1_ from student student0_ inner join person person1_ on student0_.person_id=person1_.id where student0_.id=? Student [id=1, className=D11CN2, schoolName=PTIT] Person [id=1, name=kai, address=ha noi - viet nam]
Code language: JavaScript (javascript)

Okay, Done!

Download code ví dụ trên tại đây.

Nguồn:

https://stackjava.com/hibernate/code-vi-du-hibernate-onetoone-quan-he-mot-mot.html

Tài liệu tham khảo:

https://docs.jboss.org/…/OneToOne.html

Leave a Reply

Your email address will not be published. Required fields are marked *