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 的属性可以分为布尔属性和非布尔属性。
非布尔属性包含 getter 和 setter 方法。
布尔属性包含setter和is方法。
任何属性的 Getter 方法都应以小写字母"get"(java 方法约定)开头,并以大写字母开头的字段名称继续。 例如。 字段名称为"salary",因此该字段的 getter 方法为"getSalary()"。
任何属性的 Setter 方法都应以小写字母"set"(java 方法约定)开头,以大写字母开头的字段名称和要设置为字段的参数值继续 。 例如。 字段名称为"salary",因此该字段的 setter 方法为"setSalary (double sal)"。
对于布尔属性,是检查它是 true 还是 false 的方法。 例如。 布尔属性'empty',该字段的is方法是'isEmpty()'。