欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

解析Java的Hibernate框架中的持久化类和映射文件

程序员文章站 2024-03-07 17:42:51
持久化类 hibernate的整个概念是采取从java类属性的值,并将持久到数据库表。一个映射文件hibernate的帮助确定如何从拉动类的值,并将它们映射与表和相关的域...

持久化类
hibernate的整个概念是采取从java类属性的值,并将持久到数据库表。一个映射文件hibernate的帮助确定如何从拉动类的值,并将它们映射与表和相关的域。

其对象或实例将存储在数据库表中的java类在hibernate中称为持久化类。 hibernate的效果最好,如果这些类遵循一些简单的规则,也称为普通java对象(pojo)编程模型。有下列持久化类的主要规则,但是,这些规则并不是必需的。

将所有的持久化java类需要一个默认的构造函数。

所有类应该包含为了让容易识别对象内hibernate和数据库的id。此属性映射到数据库表的主键列。

所有属性将被持久化应该声明为private,并已在javabean风格的定义的getxxx和setxxx方法。

hibernate的关键功能,代理,取决于持久化类或者是非final的,或者说声明的所有公共方法的接口的实现。

所有的类不扩展或实现的ejb框架需要进行一些专门的类和接口。

pojo名称用于强调一个给定的对象是一个普通的java对象,而不是一个特殊的对象,好更不是enterprise javabean。

一个简单的pojo例子:
基于上面提到的一些规则,我们可以如下定义一个pojo类:

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;
  }
}


映射文件
对象/关系映射的xml文档中通常被定义。这个映射文件指示hibernate如何定义的一个或多个类映射到数据库表。

虽然很多hibernate用户选择手工编写xml中,有一些工具可以用来生成映射文档。包括xdoclet,middlegen和andromda等用于高级hibernate的用户。

让我们考虑我们的对象将坚持在下一节中定义的表前面定义的pojo类。

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;
  }
}

会有一个表对应于每一个对象,你愿意提供持久性。考虑上述目的需要存储和检索到下面的rdbms表:

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>

保存的映射文件中的格式: <classname>.hbm.xml。我们保存映射文件中的文件employee.hbm.xml。来看看关于在映射文件中使用的映射元素的小细节:

映射文档是具有<hibernate-mapping>为包含所有的<class>元素的根元素的xml文档。

在<class>元素被用于定义数据库表从一个java类特定的映射。 java类名指定使用class元素的name属性和使用表属性数据库表名指定。

<meta>元素是可选元素,可以用来创建类的描述。

<id>元素映射在类中的唯一id属性到数据库表的主键。 id元素的name属性是指属性的类和column属性是指在数据库表中的列。 type属性保存了hibernate映射类型,这种类型的映射将会从java转换为sql数据类型。

id元素内的<generator>元素被用来自动生成的主键值。将生成元素的class属性设置为原生让hibernate拿起无论是identity,sequence或者hilo中的算法来创建主键根据底层数据库的支持能力。

<property>元素用于一个java类的属性映射到数据库表中的列。元素的name属性是指属性的类和column属性是指在数据库表中的列。 type属性保存了hibernate映射类型,这种类型的映射将会从java转换为sql数据类型。

还有这将在映射文件中使用,接下来尽量覆盖尽可能多其他的hibernate相关主题的其他属性和可用的元素。