Code ví dụ Hibernate @OneToOne – Quan hệ một – một.
(Xem thêm: Hướng dẫn tự học 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ó.
(Xem thêm: Sự khác nhau giữa @OneToOne với @ManyToOne trong Hibernate)
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
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
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`));
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
Các thư viện sử dụng
<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>
Cấu hình hibernate, kết nối MySQL
<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>
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
(Xem lại: Code ví dụ Hibernate EntityManager, EntityManagerFactory)
Các file entities
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
}
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
}
- Annotation 
@OneToOnebiểu thị mối quan hệ 1 – 1 @JoinColumn(name = "person_id")biểu thị rằng 2 đối tượng mapping qua columnperson_idTrườ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.
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();
  }
}
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]
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
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();
  }
}
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]
Okay, Done!
Download code ví dụ trên tại đây.
References:



