JPA注释–Hibernate 注释

时间:2020-02-23 14:35:22  来源:igfitidea点击:

JPA批注用于将Java对象映射到数据库表,列等。
Hibernate是JPA规范中最流行的实现,并提供了一些其他批注。
今天,我们将研究带有简短代码段的JPA注释以及Hibernate注释。

JPA注释–Hibernate 注释

Java批注是一种可以添加到Java源代码中的元数据。
可以从源文件中读取Java注释。
它也可以嵌入到编译器生成的类文件中并从中读取。
这允许注释在运行时由JVM保留。

JPA批注不是标准JDK的一部分,因此在添加任何实现框架时都将获得它。
例如,在Hibernate Maven依赖项下面也会为您提供JPA批注。

<dependency>
  <groupId>org.hibernate.javax.persistence</groupId>
  <artifactId>hibernate-jpa-2.1-api</artifactId>
  <version>1.0.0.Final</version>
</dependency>

用于将Java对象映射到数据库表的JPA注释

让我们看一些重要的JPA批注。
注意,这些注释存在于javax.persistence包中。

  • javax.persistence.Entity:指定该类是一个实体。
    该注释可以应用于"枚举的类"接口。

  • @Table:指定该实体所映射到的数据库中的表。
    在下面的示例中,数据将存储在"员工"表中。
    @Table批注的Name属性用于指定表名。

  • @Column:使用@Column注释指定列映射。
    此批注的Name属性用于指定表的列名。

  • @Id:此注释指定实体的主键。

  • @ GeneratedValue:此注释指定主键值的生成策略。

  • @Version:我们可以使用此注释控制版本控制或者并发。

  • @OrderBy:使用@OrderBy批注对数据进行排序。
    在下面的示例中,它将按其employee_address的ID升序对所有employee_address进行排序。

  • @Transient:实体的每个非静态和非瞬态属性都被视为持久属性,除非您将其注释为@Transient。

  • @Lob:大对象用@Lob声明。

上面的批注是最常用的JPA批注,用于定义实体。

表之间映射的Hibernate 注释

我们还有另一组注释,用于指定不同表和实体之间的关联映射。

我们将考虑以下提到的场景作为示例。

  • 表" employee"和" employeeDetail"具有一对一关联,并且它们共享相同的主键。

  • 表" communication"和" communicationDetail"通过外键链接。
    它也是一对一的关联。

  • 表"通讯"和"员工"是通过外键进行多对一关联的,链接是所有者。

  • 表格" employee"和" employeeStatus"通过多对一关联中的外键链接,而雇员是所有者。

@ OneToOneEmployee和EmployeeDetail实体共享相同的主键,我们可以使用@OneToOne和@PrimaryKeyJoinColumn将它们关联。
在这种情况下,EmployeeDetail的id属性未使用@GeneratedValue进行注释。
Employee的id值将用于EmployeeDetail的id。

import javax.persistence.Entity;

@Entity
public class Employee implements Serializable {
}

注意事项:

  • @PrimaryKeyJoinColumn应该用于共享相同主键的关联实体。

  • 当外键由实体之一持有时,应将@JoinColumn和@OneToOne映射为属性。

Communication和CommunicationDetail通过外键链接,因此可以使用@OneToOne和@JoinColumn批注。
在下面提到的代码段中,为Communication生成的id将映射到CommunicationDetail表的'communication_id'列。
@MapsId用于相同。

import javax.persistence.Entity;
import javax.persistence.Table;

@Entity
@Table(name = "employee")
public class Employee implements Serializable {
}

@ ManyToOne许多员工可以共享相同的状态。
因此,员工与employeeStatus是一对多的关系。
@ManyToOne批注可用于相同的注释。

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;

@Entity
@Table(name = "employee")
public class Employee implements Serializable {
 
@Column(name = "employee_name")
private String employeeName;
}

@ OneToMany员工之间的沟通将是一对多的关系。
此关系的所有者是Communication,因此,我们将在Employee中使用" mappedBy"属性使其成为双向关系。

import javax.persistence.*;

@Entity
@Table(name = "employee")
public class Employee implements Serializable { 
@Id
@Column(name = "id")
private int id;
}

@PrimaryKeyJoinColumn该注释用于关联共享同一主键的实体。

import javax.persistence.*;

@Entity
@Table(name = "employee")
public class Employee implements Serializable {

@Id
@Column(name = "id")
@GeneratedValue(strategy=SEQUENCE, generator="ID_SEQ")
private int id;
}

当实体之一拥有外键时,@ JoinColumn @JoinColumn批注用于一对一或者多对一关联。

import javax.persistence.*;

@Entity
@Table(name = "employee")
public class Employee implements Serializable {
@Version
@Column(name = "version")
private Date version;
}

@ JoinTable:@JoinTable和maptedBy应该用于通过关联表链接的实体。

@MapsId:可以使用@MapsId注释保留两个具有共享密钥的实体。

@OrderBy("id asc")
private Set employee_address;

用于继承映射的Hibernate注释

现在让我们尝试了解Hibernate中的继承映射注释。

Hibernate支持三种基本的继承映射策略:

  • 每个类层次结构的表
  • 每个子类表
  • 每个具体类别的表格

我们将考虑每种类型的示例。

  • 每个类层次结构的表–每个类层次结构策略的单个表。

  • 每个类/子类的表–联接子类策略。

  • 每个具体类别的表格。

  • @DiscriminatorColumn:顾名思义,此列为描述符,此注释指定SINGLE_TABLE和JOINED继承映射策略的鉴别符列。