JPA - ORM 组件

  • 简述

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

    对象关系映射 (ORM) 简要地告诉您什么是 ORM 及其工作原理。ORM 是一种编程能力,可以将数据从对象类型转换为关系类型,反之亦然。
    ORM 的主要特性是将一个对象映射或绑定到它在数据库中的数据。在映射时,我们必须考虑数据、数据类型及其与其自身实体或任何其他表中的实体的关系。
  • 高级功能

    • Idiomatic persistence :它使您能够使用面向对象的类编写持久性类。
    • High Performance : 它有很多获取技术和希望锁定技术。
    • Reliable: 它非常稳定和卓越。被许多工业程序员使用。
  • ORM架构

    这里遵循 ORM 架构。
    对象关系映射
    上面的架构解释了对象数据是如何分三个阶段存储到关系数据库中的。

    阶段1

    第一阶段,命名为 Object data阶段包含 POJO 类、服务接口和类。它是主要的业务组件层,具有业务逻辑操作和属性。
    例如,让我们以员工数据库为模式-
    • Employee POJO 类包含诸如 ID、姓名、薪水和职称等属性。以及这些属性的 setter 和 getter 方法等方法。
    • Employee DAO/Service 类包含创建员工、查找员工和删除员工等服务方法。

    阶段2

    第二阶段命名为 mapping 或者 persistence 包含 JPA 提供程序、映射文件 (ORM.xml)、JPA 加载程序和对象网格的阶段。
    • JPA Provider:包含 JPA 风格的供应商产品 (javax.persistence)。例如 Eclipselink、Toplink、Hibernate 等。
    • Mapping file :映射文件(ORM.xml)包含POJO类中的数据和关系数据库中的数据之间的映射配置。
    • JPA Loader:JPA加载器的工作原理类似于缓存,可以加载关系网格数据。它就像一个数据库副本,用于与 POJO 数据的服务类(POJO 类的属性)进行交互。
    • Object Grid:对象网格是一个临时位置,可以存储关系数据的副本,例如缓存。对数据库的所有查询首先对对象网格中的数据产生影响。只有在提交后,它才会影响主数据库。

    第三阶段

    第三阶段是关系数据阶段。它包含逻辑上连接到业务组件的关系数据。如上所述,只有当业务组件提交数据时,它才会物理存储到数据库中。在此之前,修改后的数据以网格格式存储在高速缓存中。获取数据的过程也是如此。
    上述三个阶段的程序化交互机制称为对象关系映射。
  • 映射文件

    mapping.xml 文件用于指示 JPA 供应商将实体类与数据库表进行映射。
    让我们以包含四个属性的 Employee 实体为例。名为 Employee 实体的 POJO 类Employee.java 如下:
    
    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 是该表的主键。现在我们必须为它设计休眠映射文件。映射文件名为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> : tag 定义模式定义以允许实体标签进入 xml 文件。
    • <description> : 标签定义了关于应用程序的描述。
    • <entity>: 标签定义了要转换为数据库中表的实体类。属性类定义了 POJO 实体类名。
    • <table>: 标签定义表名。如果要将类名保留为表名,则不需要此标记。
    • <attributes> : 标签定义属性(表中的字段)。
    • <id>: 标签定义了表的主键。这<generated-value> 标签定义了如何分配主键值,例如自动、手动或取自序列。
    • <basic> : 标签用于定义表的剩余属性。
    • <column-name> : 标签用于定义用户定义的表字段名称。
  • 注释

    一般使用xml文件来配置特定的组件,或者映射两种不同规格的组件。在我们的例子中,我们必须在一个框架中单独维护 xml。这意味着在编写映射 xml 文件时,我们需要将 POJO 类属性与 mapping.xml 文件中的实体标签进行比较。
    解决方法如下:在类定义中,我们可以使用注解来编写配置部分。注解用于类、属性和方法。注释以“@”符号开头。注解是在声明类、属性或方法之前声明的。JPA 的所有注解都定义在 javax.persistence 包中。
    以下是我们示例中使用的注释列表
    注解 描述
    @Entity 此注释指定将类声明为实体或表。
    @Table 该注解指定声明表名。
    @Basic 此注释明确指定非约束字段。
    @Embedded 该注解指定了类的属性或一个实体,其值是一个可嵌入类的实例。
    @Id 该注解指定属性,用于类的身份(表的主键)。
    @GeneratedValue 此注释指定如何初始化身份属性,例如自动、手动或从序列表中获取的值。
    @Transient 此注释指定了非持久性的属性,即该值永远不会存储到数据库中。
    @Column 此注释用于指定持久性属性的列或属性。
    @SequenceGenerator 该注解用于定义@GeneratedValue 注解中指定的属性的值。它创建了一个序列。
    @TableGenerator 此注释用于为@GeneratedValue 注释中指定的属性指定值生成器。它创建了一个用于生成值的表。
    @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)'。
    • 对于布尔属性,是检查它是真还是假的方法。例如布尔属性'empty',这个字段的is 方法是'isEmpty()'。