JPA - ORM组件

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

对象关系映射

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

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

高级功能

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

  • 高性能:它有许多提取技术和有希望的锁定技术.

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

ORM架构

这里遵循ORM架构.

对象关系映射

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

阶段1

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

例如,让我们将员工数据库作为模式 -

  • 员工POJO类包含ID,名称,工资和名称等属性.以及这些属性的setter和getter方法等方法.

  • Employee DAO/Service类包含服务方法,例如create employee,find employee和delete employee./p>

阶段2

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

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

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

  • JPA Loader :JPA加载程序的工作方式类似于缓存内存,可以加载关系网格数据.它就像一个数据库副本,用于与POJO数据的服务类交互(POJO类的属性).

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

阶段3

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

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

Mapping.xml

mapping.xml文件用于指示JPA供应商将Entity类映射到数据库表.

让我们以Employee实体为例其中包含四个属性.名为 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>

上面的脚本用于将实体类映射到数据库表.在此文件中

  • < entity-mappings> :tag定义允许的架构定义实体标签到xml文件中.

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

  • < entity> :tag定义要在数据库中转换为表的实体类. Attribute类定义POJO实体类名.

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

  • < attributes> :tag定义属性(表中的字段).

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

  • < basic> :标记用于定义表的剩余属性.

  • < column-name> :tag用于定义用户定义的表字段名称.

注释

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

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

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

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

Java Bean Standard

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

Bean约定

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

  • bean的属性可以分为布尔属性和非布尔属性.

  • 非布尔属性包含 getter setter 方法.

  • 布尔属性包含 setter 方法.

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

  • Setter 方法property应以小字母'set'(java方法约定)开头,继续使用以大写字母开头的字段名称和设置为field的参数值.例如.字段名称为'salary',因此该字段的setter方法为'setSalary(double sal)'.

  • 对于Boolean属性,是检查是否为这是真是假.例如.布尔属性'empty',此字段的方法是'isEmpty()'.