持久化類
Hibernate的整個概念是采取從Java類屬性的值,并將持久到數據庫表。一個映射文件Hibernate的幫助確定如何從拉動類的值,并將它們映射與表和相關的域。
其對象或實例將存儲在數據庫表中的Java類在Hibernate中稱為持久化類。 Hibernate的效果最好,如果這些類遵循一些簡單的規則,也稱為普通Java對象(POJO)編程模型。有下列持久化類的主要規則,但是,這些規則并不是必需的。
將所有的持久化Java類需要一個默認的構造函數。
所有類應該包含為了讓容易識別對象內Hibernate和數據庫的ID。此屬性映射到數據庫表的主鍵列。
所有屬性將被持久化應該聲明為private,并已在JavaBean風格的定義的getXXX和setXXX方法。
Hibernate的關鍵功能,代理,取決于持久化類或者是非final的,或者說聲明的所有公共方法的接口的實現。
所有的類不擴展或實現的EJB框架需要進行一些專門的類和接口。
POJO名稱用于強調一個給定的對象是一個普通的Java對象,而不是一個特殊的對象,好更不是Enterprise JavaBean。
一個簡單的POJO例子:
基于上面提到的一些規則,我們可以如下定義一個POJO類:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
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類。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
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表:
1
2
3
4
5
6
7
|
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如何定義的一個或多個類映射到數據庫表下面的映射文件。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
<? 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相關主題的其他屬性和可用的元素。