JPA - ORM 组件

大多数当代应用程序使用关系数据库来存储数据。 最近,许多供应商转向对象数据库以减轻数据维护的负担。 这意味着对象数据库或对象关系技术正在负责存储、检索、更新和维护。 这种对象关系技术的核心部分是映射orm.xml文件。 由于 xml 不需要编译,因此我们可以轻松地对多个数据源进行更改,从而减少管理工作。

对象关系映射

对象关系映射 (ORM) 简要介绍什么是 ORM 及其工作原理。 ORM 是一种将数据从对象类型转换为关系类型的编程能力,反之亦然。

ORM 的主要功能是将对象映射或绑定到数据库中的数据。 在映射时,我们必须考虑数据、数据类型及其与其自身实体或任何其他表中的实体的关系。

高级功能

  • 惯用的持久性:它使您能够使用面向对象的类编写持久性类。

  • 高性能:它有很多获取技术和有希望的锁定技术。

  • 可靠:高度稳定且卓越。 被许多工业程序员使用。

ORM架构

这里遵循 ORM 架构。

对象关系映射

上述架构解释了对象数据如何分三个阶段存储到关系数据库中。

第一阶段

第一阶段,称为对象数据阶段,包含POJO类、服务接口和类。 是主要的业务组件层,具有业务逻辑操作和属性。

例如,让我们将员工数据库作为架构 -

  • Employee POJO 类包含 ID、姓名、薪水和职务等属性。 以及这些属性的 setter 和 getter 方法。

  • Employee DAO/Service 类包含创建员工、查找员工和删除员工等服务方法。

第 2 阶段

第二阶段称为映射持久性阶段,其中包含JPA提供程序、映射文件(ORM.xml)、JPA加载器和对象网格。

  • JPA Provider:包含 JPA 风格 (javax.persistence) 的供应商产品。 例如Eclipselink、Toplink、Hibernate等。

  • 映射文件:映射文件(ORM.xml)包含POJO类中的数据与关系数据库中的数据之间的映射配置。

  • JPA Loader:JPA 加载器的工作原理类似于缓存,可以加载关系网格数据。 它的工作方式就像数据库的副本,与 POJO 数据的服务类(POJO 类的属性)进行交互。

  • 对象网格:对象网格是一个临时位置,可以存储关系数据的副本,即类似于高速缓存。 针对数据库的所有查询首先对对象网格中的数据生效。 只有提交后,才会影响主数据库。

第 3 阶段

第三阶段是关系数据阶段。 它包含逻辑上连接到业务组件的关系数据。 如上所述,只有当业务组件提交数据时,数据才会被物理存储到数据库中。 在此之前,修改后的数据将以网格格式存储在高速缓冲存储器中。 获取数据的过程也是如此。

上述三个阶段的编程交互机制称为对象关系映射。

mapping.xml

mapping.xml 文件用于指示 JPA 供应商将实体类与数据库表进行映射。

让我们以包含四个属性的 Employee 实体为例。 名为Employee.java的Employee实体的POJO类如下:

public class Employee {

   private int eid;
   private String ename;
   private double salary;
   private String deg;

   public Employee(int eid, String ename, double salary, String deg) {
      super( );
      this.eid = eid;
      this.ename = ename;
      this.salary = salary;
      this.deg = deg;
   }

   public Employee( ) {
      super();
   }

   public int getEid( ) {
      return eid;
   }
   
   public void setEid(int eid) {
      this.eid = eid;
   }
   
   public String getEname( ) {
      return ename;
   }
   
   public void setEname(String ename) {
      this.ename = ename;
   }

   public double getSalary( ) {
      return salary;
   }
   
   public void setSalary(double salary) {
      this.salary = salary;
   }

   public String getDeg( ) {
      return deg;
   }
   
   public void setDeg(String deg) {
      this.deg = deg;
   }
}

上面的代码是Employee实体POJO类。 它包含四个属性 eid、ename、salary 和 deg。 考虑这些属性是数据库中的表字段,eid 是该表的主键。 现在我们必须为其设计hibernate映射文件。 名为mapping.xml的映射文件如下:

<? xml version="1.0" encoding="UTF-8" ?>

<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm    
   http://java.sun.com/xml/ns/persistence/orm_1_0.xsd"
   version="1.0">
      
   <description> XML Mapping file</description>
      
   <entity class="Employee">        
      <table name="EMPLOYEETABLE"/>
      <attributes>
      
         <id name="eid">
            <generated-value strategy="TABLE"/>
         </id>

         <basic name="ename">
            <column name="EMP_NAME" length="100"/>
         </basic>
         
         <basic name="salary">
         </basic>
         
         <basic name="deg">
         </basic>
         
      </attributes>
   </entity>
   
</entity-mappings>

上面的脚本用于将实体类与数据库表进行映射。 在这个文件中

  • <entity-mappings> : 标签定义了架构定义,以允许实体标签进入 xml 文件。

  • <description> : 标签定义有关应用程序的描述。

  • <entity> : 标签定义要转换为数据库中的表的实体类。 属性类定义POJO实体类名。

  • <table> : 标签定义表名。 如果您想将类名保留为表名,则不需要此标记。

  • <attributes> : 标签定义属性(表中的字段)。

  • <id> : 标签定义表的主键。 <generated-value> 标签定义如何分配主键值,例如自动、手动或从序列中获取。

  • <basic> : 标签用于定义表格的其余属性。

  • <column-name> : 标签用于定义用户定义的表字段名称。

注解

一般Xml文件用于配置特定的组件,或者映射两个不同规格的组件。 在我们的例子中,我们必须在框架中单独维护 xml。 这意味着在编写映射 xml 文件时,我们需要将 POJO 类属性与映射.xml 文件中的实体标记进行比较。

解决方案是这样的:在类定义中,我们可以使用注解来编写配置部分。 注解用于类、属性和方法。 注解以"@"符号开头。 注解在声明类、属性或方法之前声明。 JPA的所有注解都定义在javax.persistence包中。

下面是我们示例中使用的注解列表

注解 描述
@Entity 该注解指定将类声明为实体或表。
@Table 该注解指定声明表名。
@Basic 此注解明确指定非约束字段。
@Embedded 此注解指定类或其值实例为可嵌入类的实体的属性。
@Id 此注解指定属性,用于类的标识(表的主键)。
@GeneratedValue 此注解指定如何初始化身份属性,例如自动、手动或从序列表中获取的值。
@Transient 此注解指定不持久的属性,即该值永远不会存储到数据库中。
@Column 该注解用于指定持久化属性的列或属性。
@SequenceGenerator 该注解用于定义@GenerateValue注解中指定的属性的值。 它创建一个序列。
@TableGenerator 该注解用于为@GenerateValue注解中指定的属性指定值生成器。 它创建一个用于价值生成的表。
@AccessType 此类注解用于设置访问类型。 如果您设置@AccessType(FIELD),则将发生字段明智的访问。 如果您设置@AccessType(PROPERTY),则会发生属性明智的评估。
@JoinColumn 该注解用于指定实体关联或实体集合。 这用于多对一和一对多关联。
@UniqueConstraint 该注解用于指定主表或从表的字段、唯一约束。
@ColumnResult 此注解使用 select 子句引用 SQL 查询中的列名。
@ManyToMany 该注解用于定义连接表之间的多对多关系。
@ManyToOne 该注解用于定义连接表之间的多对一关系。
@OneToMany 该注解用于定义连接表之间的一对多关系。
@OneToOne 该注解用于定义连接表之间的一对一关系。
@NamedQueries 此注解用于指定命名查询列表。
@NamedQuery 此注解用于指定使用静态名称的查询。

Java Bean 标准

Java 类,将实例值和行为封装到称为对象的单个单元中。 Java Bean是一种临时存储和可重用的组件或对象。 它是一个可序列化的类,具有默认的构造函数和 getter 和 setter 方法来单独初始化实例属性。

Bean 约定

  • Bean 包含默认构造函数或包含序列化实例的文件。 因此,一个bean可以实例化该bean。

  • Bean 的属性可以分为布尔属性和非布尔属性。

  • 非布尔属性包含 gettersetter 方法。

  • 布尔属性包含setteris方法。

  • 任何属性的 Getter 方法都应以小写字母"get"(java 方法约定)开头,并以大写字母开头的字段名称继续。 例如。 字段名称为"salary",因此该字段的 getter 方法为"getSalary()"。

  • 任何属性的 Setter 方法都应以小写字母"set"(java 方法约定)开头,以大写字母开头的字段名称和要设置为字段的参数值继续 。 例如。 字段名称为"salary",因此该字段的 setter 方法为"setSalary (double sal)"。

  • 对于布尔属性,是检查它是 true 还是 false 的方法。 例如。 布尔属性'empty',该字段的is方法是'isEmpty()'。