JPA ORM组件


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

对象关系映射

对象关系映射(ORM)简要地告诉你什么是ORM以及它是如何工作的。ORM是一种将数据从对象类型转换为关系类型的编程能力,反之亦然。

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

高级功能

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

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

  • 可靠 :它非常稳定和卓越。被许多工业程序员使用。

ORM体系结构

这里遵循ORM体系结构。

对象关系映射

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

阶段1

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

例如,让我们将雇员数据库视为模式 -

  • 员工PO​​JO类包含诸如ID,姓名,工资和指定等属性。像setter和getter方法那些属性的方法。

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

阶段2

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

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

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

  • JPA加载程序 :JPA加载程序的工作方式与缓存内存相似,后者可加载关系网格数据。它像一个数据库副本一样与POJO数据的服务类(POJO类的属性)进行交互。

  • 对象网格 :对象网格是一个临时位置,可以存储关系数据的副本,即像缓存内存。针对数据库的所有查询首先对对象网格中的数据产生影响。只有在提交之后,它才会影响主数据库。

阶段3

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

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

Mapping.xml

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

让我们举一个包含四个属性的员工实体的例子。名为 Employee.java 的POJO类Employee实体如下所示:

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>

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

  • :标签定义了允许实体标签进入XML文件的模式定义。

  • :标签定义关于应用程序的描述。

  • :标记定义了您想要在数据库中转换为表的实体类。属性类定义了POJO实体类的名称。

  • :标签定义表名。如果你想保留类名作为表名,那么这个标签是没有必要的。

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

  • :标签定义表的主键。所述 <生成值> 标签定义了如何将主键值分配诸如自动,手动,或从序列取出。

  • :标记用于定义表格的其余属性。

  • :标记用于定义用户定义的表字段名称。

  • 注解

    一般来说,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 方法。

    • 布尔属性包含 setter 并且 方法。

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

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

    • 对于布尔属性,是检查它是真还是假的方法。例如布尔属性'empty',这个字段的is方法是'isEmpty()'。