元数据映射模式

19-03-20 jdon
         

该模式属于对象关系元数据映射模式目录,此目录属于企业应用程序体系结构模式。

目的

保存元数据中对象关系映射的详细信息。

实例

Hibernate ORM Tool使用元数据映射模式在代码中使用XML或注释指定类和表之间的映射。ORM工具需要元数据来指定类和表,属性和列,关联和外键,Java类型和SQL类型等之间的映射。该信息称为对象/关系映射元数据。 元数据是关于数据的数据,映射元数据定义和管理面向对象和SQL系统中不同类型系统和关系表示之间的转换。使用XML的Hibernate ORM元数据映射示例。

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

<!DOCTYPE hibernate-mapping PUBLIC 

"-//Hibernate/Hibernate Mapping DTD//EN"

"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 

<hibernate-mapping>

   <class name = "Employee" table = "EMPLOYEE">

      

      <meta attribute = "class-description">

         This class contains the employee detail. 

      </meta>

      

      <id name = "id" type = "int" column = "id">

         <generator class="native"/>

      </id>

      

      <property name = "firstName" column = "first_name" type = "string"/>

      <property name = "lastName" column = "last_name" type = "string"/>

      <property name = "salary" column = "salary" type = "int"/>

      

   </class>

</hibernate-mapping>

处理对象关系映射的大部分代码描述了数据库中的字段如何与内存中对象中的字段相对应。由此产生的代码往往是乏味和重复写。元数据映射允许开发人员以简单的表格形式定义映射,然后可以通过通用代码处理映射,以执行读取,插入和更新数据的详细信息。

如何运作

元数据中的信息如何在运行代码方面表现出来是使用元数据映射的关键。有两条主要路线:代码生成反射编程。使用代码生成,您可以编写一个程序,其输入是元数据,其输出是执行映射的类的源代码。这些类看起来好像是手写的,但它们完全是在构建过程中生成的,通常是在编译之前。生成的映射器类与服务器代码一起部署。甲反射程序可以向对象请求一个名为setName的方法,然后在setName方法上运行一个调用方法,传入适当的参数。通过将方法(和字段)视为数据,反射程序可以从元数据文件中读取字段和方法名称,并使用它们来执行映射。

何时使用它

  • 元数据映射可以大大减少处理数据库映射所需的工作量。但是,需要一些设置工作来准备元数据映射框架。 

  • 通过创建一个处理所有常见行为的良好Layer Supertype,可以大大减少手工编码的额外工作。

源代码

为了演示这种模式,我将使用Hibernate ORM Framework策略。对象/关系映射通常在XML文档或Hibernate中的注释中定义。此映射文件指示Hibernate - 如何将定义的类映射到数据库表?

第1步:让我们创建Employee POJO类,其对象将持久存储在表employee中。

public class Employee {
   private int id;
   private String firstName; 
   private String lastName;   
   private int salary;  

   public Employee() {}
   
   public Employee(String fname, String lname, int salary) {
      this.firstName = fname;
      this.lastName = lname;
      this.salary = salary;
   }
   
   public int getId() {
      return id;
   }
   
   public void setId( int id ) {
      this.id = id;
   }
   
   public String getFirstName() {
      return firstName;
   }
   
   public void setFirstName( String first_name ) {
      this.firstName = first_name;
   }
   
   public String getLastName() {
      return lastName;
   }
   
   public void setLastName( String last_name ) {
      this.lastName = last_name;
   }
   
   public int getSalary() {
      return salary;
   }
   
   public void setSalary( int salary ) {
      this.salary = salary;
   }
}

第2步:让我们创建一个名为employee的相应数据库表。

create table EMPLOYEE (
   id INT NOT NULL auto_increment,
   first_name VARCHAR(20) default NULL,
   last_name  VARCHAR(20) default NULL,
   salary     INT  default NULL,
   PRIMARY KEY (id)
);

基于上述两个实体,我们可以定义以下映射文件,该文件指示Hibernate如何将定义的类映射到数据库表。

<?xml version = "1.0" encoding = "utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 

<hibernate-mapping>
   <class name = "Employee" table = "EMPLOYEE">
      
      <meta attribute = "class-description">
         This class contains the employee detail. 
      </meta>
      
      <id name = "id" type = "int" column = "id">
         <generator class="native"/>
      </id>
      
      <property name = "firstName" column = "first_name" type = "string"/>
      <property name = "lastName" column = "last_name" type = "string"/>
      <property name = "salary" column = "salary" type = "int"/>
      
   </class>
</hibernate-mapping>