解析Java的Hibernate框架中的持久化类和映射文件
持久化类
Hibernate的整个概念是采取从Java类属性的值,并将持久到数据库表。一个映射文件Hibernate的帮助确定如何从拉动类的值,并将它们映射与表和相关的域。
其对象或实例将存储在数据库表中的Java类在Hibernate中称为持久化类。Hibernate的效果最好,如果这些类遵循一些简单的规则,也称为普通Java对象(POJO)编程模型。有下列持久化类的主要规则,但是,这些规则并不是必需的。
将所有的持久化Java类需要一个默认的构造函数。
所有类应该包含为了让容易识别对象内Hibernate和数据库的ID。此属性映射到数据库表的主键列。
所有属性将被持久化应该声明为private,并已在JavaBean风格的定义的getXXX和setXXX方法。
Hibernate的关键功能,代理,取决于持久化类或者是非final的,或者说声明的所有公共方法的接口的实现。
所有的类不扩展或实现的EJB框架需要进行一些专门的类和接口。
POJO名称用于强调一个给定的对象是一个普通的Java对象,而不是一个特殊的对象,好更不是EnterpriseJavaBean。
一个简单的POJO例子:
基于上面提到的一些规则,我们可以如下定义一个POJO类:
publicclassEmployee{ privateintid; privateStringfirstName; privateStringlastName; privateintsalary; publicEmployee(){} publicEmployee(Stringfname,Stringlname,intsalary){ this.firstName=fname; this.lastName=lname; this.salary=salary; } publicintgetId(){ returnid; } publicvoidsetId(intid){ this.id=id; } publicStringgetFirstName(){ returnfirstName; } publicvoidsetFirstName(Stringfirst_name){ this.firstName=first_name; } publicStringgetLastName(){ returnlastName; } publicvoidsetLastName(Stringlast_name){ this.lastName=last_name; } publicintgetSalary(){ returnsalary; } publicvoidsetSalary(intsalary){ this.salary=salary; } }
映射文件
对象/关系映射的XML文档中通常被定义。这个映射文件指示Hibernate如何定义的一个或多个类映射到数据库表。
虽然很多Hibernate用户选择手工编写XML中,有一些工具可以用来生成映射文档。包括XDoclet,Middlegen和AndroMDA等用于高级Hibernate的用户。
让我们考虑我们的对象将坚持在下一节中定义的表前面定义的POJO类。
publicclassEmployee{ privateintid; privateStringfirstName; privateStringlastName; privateintsalary; publicEmployee(){} publicEmployee(Stringfname,Stringlname,intsalary){ this.firstName=fname; this.lastName=lname; this.salary=salary; } publicintgetId(){ returnid; } publicvoidsetId(intid){ this.id=id; } publicStringgetFirstName(){ returnfirstName; } publicvoidsetFirstName(Stringfirst_name){ this.firstName=first_name; } publicStringgetLastName(){ returnlastName; } publicvoidsetLastName(Stringlast_name){ this.lastName=last_name; } publicintgetSalary(){ returnsalary; } publicvoidsetSalary(intsalary){ this.salary=salary; } }
会有一个表对应于每一个对象,你愿意提供持久性。考虑上述目的需要存储和检索到下面的RDBMS表:
createtableEMPLOYEE( idINTNOTNULLauto_increment, first_nameVARCHAR(20)defaultNULL, last_nameVARCHAR(20)defaultNULL, salaryINTdefaultNULL, PRIMARYKEY(id) );
基于以上两个实体,我们可以定义它指示Hibernate如何定义的一个或多个类映射到数据库表下面的映射文件。
<?xmlversion="1.0"encoding="utf-8"?> <!DOCTYPEhibernate-mappingPUBLIC "-//Hibernate/HibernateMappingDTD//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <classname="Employee"table="EMPLOYEE"> <metaattribute="class-description"> Thisclasscontainstheemployeedetail. </meta> <idname="id"type="int"column="id"> <generatorclass="native"/> </id> <propertyname="firstName"column="first_name"type="string"/> <propertyname="lastName"column="last_name"type="string"/> <propertyname="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相关主题的其他属性和可用的元素。