📜  Hibernate – 一对一映射(1)

📅  最后修改于: 2023-12-03 15:01:08.200000             🧑  作者: Mango

Hibernate – 一对一映射

简介

Hibernate是一个流行的Java ORM框架,可以将Java对象映射到关系数据库表中并提供对对象的持久化、检索和查询功能。在Hibernate中,一对一映射是一种将一个Java对象映射到一个关系数据库表中的方法,其中一个Java对象对应一个数据库表中的一行。

一对一映射的实现

在Hibernate中实现一对一映射需要定义两个实体类,一个代表Java对象,另一个代表关系数据库表。这两个实体类需要有相同的主键作为它们之间的关联。

Java对象实体类
@Entity
@Table(name = "person")
public class Person {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Long id;
    
    @Column(name = "name")
    private String name;
    
    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "address_id")
    private Address address;
    
    // getter and setter methods
}

上述代码中,@Entity注解表示这是一个Hibernate实体类,@Table注解表示这个实体类对应的数据库表的名称为person@Id注解表示这个实体类的主键。@GeneratedValue注解表示该主键的生成策略为自动,@Column注解指定该属性对应数据库表中的列名。@OneToOne注解指定了该实体类与另一个实体类的一对一映射关系,cascade = CascadeType.ALL表示级联操作,@JoinColumn注解指定了该实体类与另一个实体类的映射通过哪个外键关联。

数据库表实体类
@Entity
@Table(name = "address")
public class Address {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Long id;
    
    @Column(name = "city")
    private String city;
    
    @Column(name = "state")
    private String state;
    
    @OneToOne(mappedBy = "address")
    private Person person;
    
    // getter and setter methods
}

上述代码中,@Entity注解表示这是一个Hibernate实体类,@Table注解表示这个实体类对应的数据库表的名称为address@Id注解表示这个实体类的主键,@GeneratedValue注解表示该主键的生成策略为自动,@Column注解指定该属性对应数据库表中的列名。@OneToOne注解指定了该实体类与另一个实体类的一对一映射关系,mappedBy属性指定了该实体类与另一个实体类的映射通过哪个属性关联。

一对一映射的查询

在Hibernate中,一对一映射的查询与其他查询一样简单。以下是一个查询name为“John Doe”的人的地址的示例。

CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<Address> criteriaQuery = criteriaBuilder.createQuery(Address.class);
Root<Person> personRoot = criteriaQuery.from(Person.class);
Join<Person, Address> addressJoin = personRoot.join("address");
criteriaQuery.select(addressJoin);
criteriaQuery.where(criteriaBuilder.equal(personRoot.get("name"), "John Doe"));
List<Address> addresses = entityManager.createQuery(criteriaQuery).getResultList();

上述代码中使用了Hibernate的Criteria API通过对Person实体类的address属性进行join查询获取到了其地址信息。其中通过criteriaBuilder.equal方法加入查询条件。最终通过entityManager.createQuery(criteriaQuery).getResultList()方法获取查询结果。

总结

以上是Hibernate中一对一映射的介绍,包括了一对一映射的实现和查询。在实际开发中,可以根据具体的情况灵活运用Hibernate的ORM能力,从而提高开发效率和程序性能。