JPA注释–Hibernate 注释
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"通过多对一关联中的外键链接,而雇员是所有者。
@ OneToOne
Employee和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继承映射策略的鉴别符列。