Hibernate 入门----第一个Hibernate应用程序
生活随笔
收集整理的這篇文章主要介紹了
Hibernate 入门----第一个Hibernate应用程序
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
(可參考Hibernate中文文檔--附件下載)
[align=center][size=medium] 第一個Hibernate應(yīng)用程序 [/size][/align]
[b]一、首先我們將創(chuàng)建一個簡單的基于控制臺的(console-based)Hibernate應(yīng)用程序。[/b]
我們所做的第一件事就是把所有需要用到的Java庫文件放進開發(fā)的目錄中。解壓縮從Hibernate網(wǎng)站下載的Hibernate發(fā)布包,并把庫文件拷到我們新建開發(fā)目錄下的/lib目錄下。看起來就像這樣:
.
+lib
antlr.jar
cglib.jar
asm.jar
asm-attrs.jars
commons-collections.jar
commons-logging.jar
ehcache.jar
hibernate3.jar
jta.jar
dom4j.jar
假設(shè)我們希望有一個小應(yīng)用程序可以保存和查詢events(活動)。
接下來我們創(chuàng)建一個類,用來代表那些我們希望儲存在數(shù)據(jù)庫里的event。
[b]二、第一個class [/b]
我們的第一個持久化類是一個帶有一些屬性(property)的簡單JavaBean類:
package events;
import java.util.Date;
public class Event {
private Long id;
private String title;
private Date date;
public Event() {}
// ...getter/setter省略
}
把這個Java源代碼文件放到開發(fā)目錄下的src目錄里,注意包位置要正確。 現(xiàn)在這個目錄看起來應(yīng)該像這樣:
.
+lib
<Hibernate and third-party libraries>
+src
+events
Event.java
下一步,我們把這個持久化類的信息告訴Hibernate。
[b]三、映射文件 [/b]
Hibernate需要知道怎樣去加載(load)和存儲(store)持久化類的對象。這正是Hibernate映射文件發(fā)揮作用的地方。映射文件告訴Hibernate它,應(yīng)該訪問數(shù)據(jù)庫(database)里面的哪個表(table)及應(yīng)該使用表里面的哪些字段(column)。
我們在映射文件里面包含需要持久化屬性的聲明。默認情況下,類里面的屬性都被視為非持久化的:
<hibernate-mapping>
<class name="events.Event" table="EVENTS">
<id name="id" column="EVENT_ID">
<generator class="native"/>
</id>
<property name="date" type="timestamp" column="EVENT_DATE"/>
<property name="title"/>
</class>
</hibernate-mapping>
把這個映射文件保存為Event.hbm.xml,放在EventJava類的源文件目錄下。映射文件可隨意地命名,但hbm.xml的后綴已成為Hibernate開發(fā)者社區(qū)的約定。現(xiàn)在目錄結(jié)構(gòu)看起來應(yīng)該像這樣:
.
+lib
<Hibernate and third-party libraries>
+src
+events
Event.java
Event.hbm.xml
我們繼續(xù)進行Hibernate的主要配置。
[b]四、Hibernate配置[/b]
現(xiàn)在我們已經(jīng)有了一個持久化類和它的映射文件,該是配置Hibernate的時候了。在此之前,我們需要一個數(shù)據(jù)庫。在這里,我們使用MySQL數(shù)據(jù)庫, 你只需下載 mysql-connector-java-3.1.1-alpha-bin.jar文件,并把這個文件放在開發(fā)文件夾的lib/目錄下即可。
Hibernate是你的應(yīng)用程序里連接數(shù)據(jù)庫的那層,所以它需要連接用的信息。連接是通過一個也由我們配置的JDBC連接池(connection pool)來完成的。注意,如果你希望使用其他的第三方連接池軟件,你必須拷貝所需的庫文件到你的classpath下,并使用不同的連接池設(shè)置。
為了保存Hibernate的配置,我們可以使用一個簡單的hibernate.properties文件,或者一個稍微復(fù)雜的hibernate.cfg.xml,甚至可以完全使用程序來配置Hibernate。多數(shù)用戶更喜歡使用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>
<!-- Database connection settings -->
<property name="connection.driver_class">org.gjt.mm.mysql.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&useServerPrepStmts=false</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<!-- JDBC connection pool (use the built-in) -->
<property name="connection.pool_size">1</property>
<!-- SQL dialect -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- Enable Hibernate's automatic session context management -->
<property name="current_session_context_class">thread</property>
<!-- Disable the second-level cache -->
<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
<!-- Echo all executed SQL to stdout -->
<property name="show_sql">true</property>
<mapping resource="events/Event.hbm.xml"/>
</session-factory>
</hibernate-configuration>
把這個文件拷貝到源代碼目錄下面,這樣它就位于classpath的根目錄(/src/)的最后。Hibernate在啟動時會自動在classpath的根目錄查找名為hibernate.cfg.xml的配置文件。
[b]五、啟動和輔助類 [/b]
我們啟動Hibernate時要創(chuàng)建一個全局的SessoinFactory,SessionFactory可以創(chuàng)建并打開新的Session。一個Session代表一個單線程的單元操作,SessionFactory則是個線程安全的全局對象,只需要被實例化一次。
我們將創(chuàng)建一個HibernateUtil輔助類(helper class)來負責(zé)啟動Hibernate和更方便地操作SessionFactory。讓我們來看一下它的實現(xiàn):
package util;
import org.hibernate.*;
import org.hibernate.cfg.*;
public class HibernateUtil {
private static final SessionFactory sessionFactory;
static {
try {
// Create the SessionFactory from hibernate.cfg.xml
sessionFactory = new Configuration().configure().buildSessionFactory();
} catch (Throwable ex) {
// Make sure you log the exception, as it might be swallowed
System.err.println("Initial SessionFactory creation failed." + ex);
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
這個類不但在它的靜態(tài)初始化過程(僅當(dāng)加載這個類的時候被JVM執(zhí)行一次)中產(chǎn)生全局的SessionFactory,而且隱藏了它使用了靜態(tài)singleton的事實。它也可能在應(yīng)用程序服務(wù)器中的JNDI查找SessionFactory。
把HibernateUtil.java放在開發(fā)目錄的源代碼路徑下,與放events的包并列:
.
+lib
<Hibernate and third-party libraries>
+src
+events
Event.java
Event.hbm.xml
+util
HibernateUtil.java
hibernate.cfg.xml
示例的基本框架完成了 - 現(xiàn)在我們可以用Hibernate來做些真正的工作。
[b]六、加載并存儲對象 [/b]
我們終于可以使用Hibernate來加載和存儲對象了,編寫一個帶有main()方法的EventManager類:
package events;
import org.hibernate.Session;
import java.util.Date;
import util.HibernateUtil;
public class EventManager {
public static void main(String[] args) {
EventManager mgr = new EventManager();
if (args[0].equals("store")) {
mgr.createAndStoreEvent("My Event", new Date());
}
else if (args[0].equals("list")) {
List events = mgr.listEvents();
for (int i = 0; i < events.size(); i++) {
Event theEvent = (Event) events.get(i);
System.out.println("Event: " + theEvent.getTitle() +
" Time: " + theEvent.getDate());
}
}
HibernateUtil.getSessionFactory().close();
}
private void createAndStoreEvent(String title, Date theDate) {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Event theEvent = new Event();
theEvent.setTitle(title);
theEvent.setDate(theDate);
session.save(theEvent);
session.getTransaction().commit();
}
private List listEvents() {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
List result = session.createQuery("from Event").list();
session.getTransaction().commit();
return result;
}
}
可以在Eclipse執(zhí)行Open Run Dialog...鍵入不同的Arguments運行不同的操作。
我們創(chuàng)建了個新的Event對象并把它傳遞給Hibernate。現(xiàn)在Hibernate負責(zé)與SQL打交道,并把INSERT命令傳給數(shù)據(jù)庫。在運行之前,讓我們看一下處理Session和Transaction的代碼。
sessionFactory.getCurrentSession()是干什么的呢?首先,只要你持有SessionFactory(我們通過HibernateUtil,可以隨時獲得),大可在任何時候、任何地點調(diào)用這個方法。getCurrentSession()方法總會返回“當(dāng)前的”工作單元。
Session在第一次被使用的時候,即第一次調(diào)用getCurrentSession()的時候,其生命周期就開始。然后它被Hibernate綁定到當(dāng)前線程。當(dāng)事務(wù)結(jié)束的時候,不管是提交還是回滾,Hibernate會自動把Session從當(dāng)前線程剝離,并且關(guān)閉它。假若你再次調(diào)用getCurrentSession(),你會得到一個新的Session,并且開始一個新的工作單元。這種線程綁定的編程模型(model)是使用Hibernate的最廣泛的方式,因為它支持對你的代碼靈活分層。
簡單地搭建Hibernate、并完成配置至此結(jié)束!
(可參考Hibernate中文文檔)
[align=center][size=medium] 第一個Hibernate應(yīng)用程序 [/size][/align]
[b]一、首先我們將創(chuàng)建一個簡單的基于控制臺的(console-based)Hibernate應(yīng)用程序。[/b]
我們所做的第一件事就是把所有需要用到的Java庫文件放進開發(fā)的目錄中。解壓縮從Hibernate網(wǎng)站下載的Hibernate發(fā)布包,并把庫文件拷到我們新建開發(fā)目錄下的/lib目錄下。看起來就像這樣:
.
+lib
antlr.jar
cglib.jar
asm.jar
asm-attrs.jars
commons-collections.jar
commons-logging.jar
ehcache.jar
hibernate3.jar
jta.jar
dom4j.jar
假設(shè)我們希望有一個小應(yīng)用程序可以保存和查詢events(活動)。
接下來我們創(chuàng)建一個類,用來代表那些我們希望儲存在數(shù)據(jù)庫里的event。
[b]二、第一個class [/b]
我們的第一個持久化類是一個帶有一些屬性(property)的簡單JavaBean類:
package events;
import java.util.Date;
public class Event {
private Long id;
private String title;
private Date date;
public Event() {}
// ...getter/setter省略
}
把這個Java源代碼文件放到開發(fā)目錄下的src目錄里,注意包位置要正確。 現(xiàn)在這個目錄看起來應(yīng)該像這樣:
.
+lib
<Hibernate and third-party libraries>
+src
+events
Event.java
下一步,我們把這個持久化類的信息告訴Hibernate。
[b]三、映射文件 [/b]
Hibernate需要知道怎樣去加載(load)和存儲(store)持久化類的對象。這正是Hibernate映射文件發(fā)揮作用的地方。映射文件告訴Hibernate它,應(yīng)該訪問數(shù)據(jù)庫(database)里面的哪個表(table)及應(yīng)該使用表里面的哪些字段(column)。
我們在映射文件里面包含需要持久化屬性的聲明。默認情況下,類里面的屬性都被視為非持久化的:
<hibernate-mapping>
<class name="events.Event" table="EVENTS">
<id name="id" column="EVENT_ID">
<generator class="native"/>
</id>
<property name="date" type="timestamp" column="EVENT_DATE"/>
<property name="title"/>
</class>
</hibernate-mapping>
把這個映射文件保存為Event.hbm.xml,放在EventJava類的源文件目錄下。映射文件可隨意地命名,但hbm.xml的后綴已成為Hibernate開發(fā)者社區(qū)的約定。現(xiàn)在目錄結(jié)構(gòu)看起來應(yīng)該像這樣:
.
+lib
<Hibernate and third-party libraries>
+src
+events
Event.java
Event.hbm.xml
我們繼續(xù)進行Hibernate的主要配置。
[b]四、Hibernate配置[/b]
現(xiàn)在我們已經(jīng)有了一個持久化類和它的映射文件,該是配置Hibernate的時候了。在此之前,我們需要一個數(shù)據(jù)庫。在這里,我們使用MySQL數(shù)據(jù)庫, 你只需下載 mysql-connector-java-3.1.1-alpha-bin.jar文件,并把這個文件放在開發(fā)文件夾的lib/目錄下即可。
Hibernate是你的應(yīng)用程序里連接數(shù)據(jù)庫的那層,所以它需要連接用的信息。連接是通過一個也由我們配置的JDBC連接池(connection pool)來完成的。注意,如果你希望使用其他的第三方連接池軟件,你必須拷貝所需的庫文件到你的classpath下,并使用不同的連接池設(shè)置。
為了保存Hibernate的配置,我們可以使用一個簡單的hibernate.properties文件,或者一個稍微復(fù)雜的hibernate.cfg.xml,甚至可以完全使用程序來配置Hibernate。多數(shù)用戶更喜歡使用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>
<!-- Database connection settings -->
<property name="connection.driver_class">org.gjt.mm.mysql.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&useServerPrepStmts=false</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<!-- JDBC connection pool (use the built-in) -->
<property name="connection.pool_size">1</property>
<!-- SQL dialect -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- Enable Hibernate's automatic session context management -->
<property name="current_session_context_class">thread</property>
<!-- Disable the second-level cache -->
<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
<!-- Echo all executed SQL to stdout -->
<property name="show_sql">true</property>
<mapping resource="events/Event.hbm.xml"/>
</session-factory>
</hibernate-configuration>
把這個文件拷貝到源代碼目錄下面,這樣它就位于classpath的根目錄(/src/)的最后。Hibernate在啟動時會自動在classpath的根目錄查找名為hibernate.cfg.xml的配置文件。
[b]五、啟動和輔助類 [/b]
我們啟動Hibernate時要創(chuàng)建一個全局的SessoinFactory,SessionFactory可以創(chuàng)建并打開新的Session。一個Session代表一個單線程的單元操作,SessionFactory則是個線程安全的全局對象,只需要被實例化一次。
我們將創(chuàng)建一個HibernateUtil輔助類(helper class)來負責(zé)啟動Hibernate和更方便地操作SessionFactory。讓我們來看一下它的實現(xiàn):
package util;
import org.hibernate.*;
import org.hibernate.cfg.*;
public class HibernateUtil {
private static final SessionFactory sessionFactory;
static {
try {
// Create the SessionFactory from hibernate.cfg.xml
sessionFactory = new Configuration().configure().buildSessionFactory();
} catch (Throwable ex) {
// Make sure you log the exception, as it might be swallowed
System.err.println("Initial SessionFactory creation failed." + ex);
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
這個類不但在它的靜態(tài)初始化過程(僅當(dāng)加載這個類的時候被JVM執(zhí)行一次)中產(chǎn)生全局的SessionFactory,而且隱藏了它使用了靜態(tài)singleton的事實。它也可能在應(yīng)用程序服務(wù)器中的JNDI查找SessionFactory。
把HibernateUtil.java放在開發(fā)目錄的源代碼路徑下,與放events的包并列:
.
+lib
<Hibernate and third-party libraries>
+src
+events
Event.java
Event.hbm.xml
+util
HibernateUtil.java
hibernate.cfg.xml
示例的基本框架完成了 - 現(xiàn)在我們可以用Hibernate來做些真正的工作。
[b]六、加載并存儲對象 [/b]
我們終于可以使用Hibernate來加載和存儲對象了,編寫一個帶有main()方法的EventManager類:
package events;
import org.hibernate.Session;
import java.util.Date;
import util.HibernateUtil;
public class EventManager {
public static void main(String[] args) {
EventManager mgr = new EventManager();
if (args[0].equals("store")) {
mgr.createAndStoreEvent("My Event", new Date());
}
else if (args[0].equals("list")) {
List events = mgr.listEvents();
for (int i = 0; i < events.size(); i++) {
Event theEvent = (Event) events.get(i);
System.out.println("Event: " + theEvent.getTitle() +
" Time: " + theEvent.getDate());
}
}
HibernateUtil.getSessionFactory().close();
}
private void createAndStoreEvent(String title, Date theDate) {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Event theEvent = new Event();
theEvent.setTitle(title);
theEvent.setDate(theDate);
session.save(theEvent);
session.getTransaction().commit();
}
private List listEvents() {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
List result = session.createQuery("from Event").list();
session.getTransaction().commit();
return result;
}
}
可以在Eclipse執(zhí)行Open Run Dialog...鍵入不同的Arguments運行不同的操作。
我們創(chuàng)建了個新的Event對象并把它傳遞給Hibernate。現(xiàn)在Hibernate負責(zé)與SQL打交道,并把INSERT命令傳給數(shù)據(jù)庫。在運行之前,讓我們看一下處理Session和Transaction的代碼。
sessionFactory.getCurrentSession()是干什么的呢?首先,只要你持有SessionFactory(我們通過HibernateUtil,可以隨時獲得),大可在任何時候、任何地點調(diào)用這個方法。getCurrentSession()方法總會返回“當(dāng)前的”工作單元。
Session在第一次被使用的時候,即第一次調(diào)用getCurrentSession()的時候,其生命周期就開始。然后它被Hibernate綁定到當(dāng)前線程。當(dāng)事務(wù)結(jié)束的時候,不管是提交還是回滾,Hibernate會自動把Session從當(dāng)前線程剝離,并且關(guān)閉它。假若你再次調(diào)用getCurrentSession(),你會得到一個新的Session,并且開始一個新的工作單元。這種線程綁定的編程模型(model)是使用Hibernate的最廣泛的方式,因為它支持對你的代碼靈活分層。
簡單地搭建Hibernate、并完成配置至此結(jié)束!
(可參考Hibernate中文文檔)
總結(jié)
以上是生活随笔為你收集整理的Hibernate 入门----第一个Hibernate应用程序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IBM公司扩展云平台 计划推出Smart
- 下一篇: 微信和钉钉电脑客户端多开的解决方法(Wi