第一個Hibernate with Annotation程式
Hibernate是ORM的解決方案,其底層對數據庫的操作依賴于JDBC,所以您必須先取得JDBC驅動程序,在這邊所使用的是MySQL,所以您必須至 MySQL? Connector/J 取得MySQL的JDBC驅動程序。
接下來至 Hibernate 官方網站 取得Hibernate 3.2、Hibernate Annotations 3.2。
您必須安裝JDK 5.0才可以使用Hibernate Annotations的功能。
解開Hibernate 3.2的zip檔案后,當中的hibernate3.jar是必要的,而在lib目錄中還包括了許多jar檔案,您可以在 Hibernate 3.0官方的參考手冊 上找到這些jar的相關說明,其中必要的是 antlr、dom4j、CGLIB、asm、Commons Collections、Commons Logging、 EHCache,Hibernate底層還需要Java Transaction API,所以您還需要jta.jar。
解開Hibernate Annotations 3.2的zip檔案后,您需要hibernate-annotations.jar、ejb3-persistence.jar這兩個檔案。
到這邊為止,總共需要以下的jar檔案:

Hibernate可以運行于單機之上,也可以運行于Web應用程序之中,如果是運行于單機,則將所有用到的jar檔案(包括JDBC驅動程序)設定至CLASSPATH中,如果是運行于Web應用程序中,則將jar檔案置放于WEB-INF/lib中。
如果您還需要額外的Library,再依需求加入,例如JUnit、Proxool等等,接下來可以將etc目錄下的 log4j.properties復制至Hibernate項目的Classpath下,并修改一下當中的 log4j.logger.org.hibernate為error,也就是只在在錯誤發生時顯示必要的訊息。
接著設置基本的Hibernate配置文件,可以使用XML或Properties檔案,這邊先使用XML,檔名預設為hibernate.cfg.xml:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
? "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
? "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
?
<hibernate-configuration>
??? <session-factory>
??????? <!-- 顯示實際操作數據庫時的SQL -->
??????? <property name="show_sql">true</property>
??????? <!-- SQL方言,這邊設定的是MySQL -->
??????? <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
??????? <!-- JDBC驅動程序 -->
??????? <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
??????? <!-- JDBC URL -->
??????? <property name="connection.url">jdbc:mysql://localhost/demo</property>
??????? <!-- 數據庫使用者 -->
??????? <property name="connection.username">root</property>
??????? <!-- 數據庫密碼 -->
??????? <property name="connection.password">123456</property>
?
??????? <!-- 以下設置對象與數據庫表格映像類別 -->
??????? <mapping class="onlyfun.caterpillar.User"/>
??? </session-factory>
</hibernate-configuration>
這邊以一個簡單的單機程序來示范Hibernate的配置與功能,首先作數據庫的準備工作,在MySQL中新增一個demo數據庫,并建立user表格:
package onlyfun.caterpillar;
?
import javax.persistence.*;
?
@Entity
@Table(name="user") // 非必要,在表格名稱與類別名稱不同時使用
public class User {
? @Id
? @GeneratedValue(strategy=GenerationType.AUTO)
??? private Integer id;
?
? @Column(name="name") // 非必要,在字段名稱與屬性名稱不同時使用
??? private String name;
?
? @Column(name="age")
??? private Integer age; // 非必要,在字段名稱與屬性名稱不同時使用
???
??? // 必須要有一個預設的建構方法
??? // 以使得Hibernate可以使用Constructor.newInstance()建立對象
??? public User() {
??? }
?
??? public Integer getId() {
??????? return id;
??? }
?
??? public void setId(Integer id) {
??????? this.id = id;
??? }
?
??? public String getName() {
??????? return name;
??? }
?
??? public void setName(String name) {
??????? this.name = name;
??? }
???
??? public Integer getAge() {
??????? return age;
??? }
?
??? public void setAge(Integer age) {
??????? this.age = age;
??? }
}
其中id是個特殊的屬性,Hibernate會使用它來作為主鍵識別,您可以定義主鍵產生的方式,這邊設定為自動產生主鍵,可以看到,實體標識,主鍵生成,以及相關映像,都可以使用Annotation來完成。
接下來撰寫一個測試的程序,這個程序直接以Java程序設計人員熟悉的語法方式來操作對象,而實際上也直接完成對數據庫的操作,程序將會將一筆數據存入表格之中:
package onlyfun.caterpillar;
?
import org.hibernate.SessionFactory;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.cfg.Configuration;
?
public class HibernateAnnotationDemo {
?
??? public static void main(String[] args) {
??????? // 需要AnnotationConfiguration讀取Annotation訊息
??????? Configuration config = new AnnotationConfiguration().configure();
??????? // 根據 config 建立 SessionFactory
??????? // SessionFactory 將用于建立 Session
??????? SessionFactory sessionFactory = config.buildSessionFactory();
?
??????? // 將持久化的物件
??????? User user = new User();
??????? user.setName("caterpillar");
??????? user.setAge(new Integer(30));????
?
??????? // 開啟Session,相當于開啟JDBC的Connection
??????? Session session = sessionFactory.openSession();
??????? // Transaction表示一組會話操作
??????? Transaction tx= session.beginTransaction();
??????? // 將對象映像至數據庫表格中儲存
??????? session.save(user);
??????? tx.commit();
??????? session.close();
??????? sessionFactory.close();
??????
??????? System.out.println("新增資料OK!請先用MySQL觀看結果!");
??? }
}
注意,使用Annotation時,需要的是AnnotationConfiguration類別。
如您所看到的,程序中只需要直接操作User對象,并進行Session與Transaction的相關操作,Hibernate就會自動完成對數據庫的操作,您看不到任何一行JDBC或SQL的陳述,撰寫好以上的各個檔案之后,各檔案的放置位置如下:

接著可以開始運行程序,結果如下:
執行結果中顯示了Hibernate所實際使用的SQL,由于這個程序還沒有查詢功能,所以要進入MySQL中看看新增的數據,如下:
接下來至 Hibernate 官方網站 取得Hibernate 3.2、Hibernate Annotations 3.2。
您必須安裝JDK 5.0才可以使用Hibernate Annotations的功能。
解開Hibernate 3.2的zip檔案后,當中的hibernate3.jar是必要的,而在lib目錄中還包括了許多jar檔案,您可以在 Hibernate 3.0官方的參考手冊 上找到這些jar的相關說明,其中必要的是 antlr、dom4j、CGLIB、asm、Commons Collections、Commons Logging、 EHCache,Hibernate底層還需要Java Transaction API,所以您還需要jta.jar。
解開Hibernate Annotations 3.2的zip檔案后,您需要hibernate-annotations.jar、ejb3-persistence.jar這兩個檔案。
到這邊為止,總共需要以下的jar檔案:

Hibernate可以運行于單機之上,也可以運行于Web應用程序之中,如果是運行于單機,則將所有用到的jar檔案(包括JDBC驅動程序)設定至CLASSPATH中,如果是運行于Web應用程序中,則將jar檔案置放于WEB-INF/lib中。
如果您還需要額外的Library,再依需求加入,例如JUnit、Proxool等等,接下來可以將etc目錄下的 log4j.properties復制至Hibernate項目的Classpath下,并修改一下當中的 log4j.logger.org.hibernate為error,也就是只在在錯誤發生時顯示必要的訊息。
接著設置基本的Hibernate配置文件,可以使用XML或Properties檔案,這邊先使用XML,檔名預設為hibernate.cfg.xml:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
? "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
? "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
?
<hibernate-configuration>
??? <session-factory>
??????? <!-- 顯示實際操作數據庫時的SQL -->
??????? <property name="show_sql">true</property>
??????? <!-- SQL方言,這邊設定的是MySQL -->
??????? <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
??????? <!-- JDBC驅動程序 -->
??????? <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
??????? <!-- JDBC URL -->
??????? <property name="connection.url">jdbc:mysql://localhost/demo</property>
??????? <!-- 數據庫使用者 -->
??????? <property name="connection.username">root</property>
??????? <!-- 數據庫密碼 -->
??????? <property name="connection.password">123456</property>
?
??????? <!-- 以下設置對象與數據庫表格映像類別 -->
??????? <mapping class="onlyfun.caterpillar.User"/>
??? </session-factory>
</hibernate-configuration>
這邊以一個簡單的單機程序來示范Hibernate的配置與功能,首先作數據庫的準備工作,在MySQL中新增一個demo數據庫,并建立user表格:
CREATE TABLE user (對于這個表格,您有一個User類別與之對應,表格中的每一個字段將對應至User實例上的Field成員。
id INT(11) NOT NULL auto_increment PRIMARY KEY,
name VARCHAR(100) NOT NULL default'',
age INT
);
package onlyfun.caterpillar;
?
import javax.persistence.*;
?
@Entity
@Table(name="user") // 非必要,在表格名稱與類別名稱不同時使用
public class User {
? @Id
? @GeneratedValue(strategy=GenerationType.AUTO)
??? private Integer id;
?
? @Column(name="name") // 非必要,在字段名稱與屬性名稱不同時使用
??? private String name;
?
? @Column(name="age")
??? private Integer age; // 非必要,在字段名稱與屬性名稱不同時使用
???
??? // 必須要有一個預設的建構方法
??? // 以使得Hibernate可以使用Constructor.newInstance()建立對象
??? public User() {
??? }
?
??? public Integer getId() {
??????? return id;
??? }
?
??? public void setId(Integer id) {
??????? this.id = id;
??? }
?
??? public String getName() {
??????? return name;
??? }
?
??? public void setName(String name) {
??????? this.name = name;
??? }
???
??? public Integer getAge() {
??????? return age;
??? }
?
??? public void setAge(Integer age) {
??????? this.age = age;
??? }
}
其中id是個特殊的屬性,Hibernate會使用它來作為主鍵識別,您可以定義主鍵產生的方式,這邊設定為自動產生主鍵,可以看到,實體標識,主鍵生成,以及相關映像,都可以使用Annotation來完成。
接下來撰寫一個測試的程序,這個程序直接以Java程序設計人員熟悉的語法方式來操作對象,而實際上也直接完成對數據庫的操作,程序將會將一筆數據存入表格之中:
package onlyfun.caterpillar;
?
import org.hibernate.SessionFactory;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.cfg.Configuration;
?
public class HibernateAnnotationDemo {
?
??? public static void main(String[] args) {
??????? // 需要AnnotationConfiguration讀取Annotation訊息
??????? Configuration config = new AnnotationConfiguration().configure();
??????? // 根據 config 建立 SessionFactory
??????? // SessionFactory 將用于建立 Session
??????? SessionFactory sessionFactory = config.buildSessionFactory();
?
??????? // 將持久化的物件
??????? User user = new User();
??????? user.setName("caterpillar");
??????? user.setAge(new Integer(30));????
?
??????? // 開啟Session,相當于開啟JDBC的Connection
??????? Session session = sessionFactory.openSession();
??????? // Transaction表示一組會話操作
??????? Transaction tx= session.beginTransaction();
??????? // 將對象映像至數據庫表格中儲存
??????? session.save(user);
??????? tx.commit();
??????? session.close();
??????? sessionFactory.close();
??????
??????? System.out.println("新增資料OK!請先用MySQL觀看結果!");
??? }
}
注意,使用Annotation時,需要的是AnnotationConfiguration類別。
如您所看到的,程序中只需要直接操作User對象,并進行Session與Transaction的相關操作,Hibernate就會自動完成對數據庫的操作,您看不到任何一行JDBC或SQL的陳述,撰寫好以上的各個檔案之后,各檔案的放置位置如下:

接著可以開始運行程序,結果如下:
Hibernate: insert into user (name, age) values (?, ?)
新增資料OK!請先用MySQL觀看結果!
新增資料OK!請先用MySQL觀看結果!
執行結果中顯示了Hibernate所實際使用的SQL,由于這個程序還沒有查詢功能,所以要進入MySQL中看看新增的數據,如下:
mysql> select * from user;
+----+-----------------+------+
| id??? | name???????? | age? |
+----+-----------------+------+
|? 1??? | caterpillar? | 30?? |
+----+-----------------+------+
1 row in set (0.03 sec)
+----+-----------------+------+
| id??? | name???????? | age? |
+----+-----------------+------+
|? 1??? | caterpillar? | 30?? |
+----+-----------------+------+
1 row in set (0.03 sec)
posted on 2006-09-01 14:00 Binary 閱讀(304) 評論(0) 編輯 收藏 所屬分類: Hibernate