亚洲AV无码男人的天堂,亚洲AV综合色区无码二区爱AV,亚洲情A成黄在线观看动漫软件 http://www.tkk7.com/songfei/category/10306.html程序--人生--哲學(xué)___________________歡迎艷兒的加入zh-cnMon, 02 Apr 2007 05:54:04 GMTMon, 02 Apr 2007 05:54:04 GMT60Hibernate技術(shù)全面學(xué)習(xí) http://www.tkk7.com/songfei/articles/107696.html天外飛仙天外飛仙Sat, 31 Mar 2007 14:00:00 GMThttp://www.tkk7.com/songfei/articles/107696.htmlhttp://www.tkk7.com/songfei/comments/107696.htmlhttp://www.tkk7.com/songfei/articles/107696.html#Feedback0http://www.tkk7.com/songfei/comments/commentRss/107696.htmlhttp://www.tkk7.com/songfei/services/trackbacks/107696.html閱讀全文

天外飛仙 2007-03-31 22:00 發(fā)表評論
]]>
在Hibernate中使用多表查詢的一種實現(xiàn) http://www.tkk7.com/songfei/articles/107686.html天外飛仙天外飛仙Sat, 31 Mar 2007 13:20:00 GMThttp://www.tkk7.com/songfei/articles/107686.htmlhttp://www.tkk7.com/songfei/comments/107686.htmlhttp://www.tkk7.com/songfei/articles/107686.html#Feedback0http://www.tkk7.com/songfei/comments/commentRss/107686.htmlhttp://www.tkk7.com/songfei/services/trackbacks/107686.html????在設(shè)計到多表操作時,Hibernate提供了與數(shù)據(jù)庫表關(guān)系相對應(yīng)的對象映射關(guān)系,一對一、一對多和多對多在這里都可以通過Hibernate的對象映射關(guān)系(Set等)來實現(xiàn)。這為一般情況下的數(shù)據(jù)庫多表操作提供了便捷途徑。關(guān)于這方面的介紹已經(jīng)很多,在這里不再復(fù)述。
????但是,在有些情況下的多表操作,比如一個統(tǒng)計顧客在2005年的消費總金額的SQL操作如下:
select b.name, count(a.fee) mix(a.chargeBeginTime) max(a.chargeEndTime) from charge a, customer b where a.idCustomer = b.idCustomer and a.chargeBeginTime >= '2005-01-01' and a.chargeEndTime < '2005-12-31' gourp by a.idCustomer
customer表和charge結(jié)構(gòu)如下:

customer表結(jié)構(gòu):
+------------+-------------+------+-----+---------+-------+
| Field????? | Type??????? | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| IdCustomer | varchar(32) |????? | PRI |???????? |?????? |
| Name?????? | varchar(30) |????? |???? |???????? |?????? |
+------------+-------------+------+-----+---------+-------+

charge表結(jié)構(gòu):
+-----------------+-------------+------+-----+---------+-------+
| Field?????????? | Type??????? | Null | Key | Default | Extra |
+-----------------+-------------+------+-----+---------+-------+
| IdCharge??????? | varchar(32) |????? | PRI |???????? |?????? |
| Fee???????????? | double????? | YES? |???? | NULL??? |?????? |
| ChargeTimeBegin | datetime??? | YES? |???? | NULL??? |?????? |
| ChargeTimeEnd?? | datetime??? | YES? |???? | NULL??? |?????? |
+-----------------+-------------+------+-----+---------+-------+

在Hibernate的自帶文檔中有類似下面的多表查詢操作提示:
“select new OjbectC(field1, field2,...) from ObjectA a, ObjectB b ...”,
分析一下可以看出這個操作有兩個缺點:
????1)必須聲明并創(chuàng)建類ObjectC,根據(jù)Hibernate的特點,需要寫一個ObjectC.hbm.xml的PO映射,在只用到創(chuàng)建查詢結(jié)果的新對象的時候,這個映射可以是個虛的,即可以沒有一個真正的數(shù)據(jù)庫表和ObjectC對應(yīng),但是這樣的一個虛設(shè)的邏輯顯然已經(jīng)違背了Hibernate的思想初衷;
????2)這個辦法只能查詢出但條結(jié)果記錄并只能創(chuàng)建單個的ObjectC對象,這是很局限的,因此在某些情況下根本不能使用(比如本例)。
????所以,對于本例,上面的方法是行不通的。

其實,仔細看看Hibernate的API,就會發(fā)現(xiàn)這個問題很好解決。在net.sf.hibernate包中有下面三個對我們很有用的接口:

1、Interface ScrollableResults
????這個接口類似JDBC中的ResultSet一樣,提供了對返回結(jié)果集合的遍歷和字段訪問方法,如:
????public boolean next()????游標后移
????public boolean previous() 游標前移
????public boolean scroll(int?i) 游標移動到指定未知
????public void beforeFirst() 游標在首記錄前
????public void afterLast() 游標在末記錄后
????public Object[] get() 將當前記錄的字段值以O(shè)bject對象數(shù)組形式返回
????public Objectget(int?i) 將當前記錄的特定字段值以O(shè)bject對象形式返回
????public IntegergetInteger(int?col) 將當前記錄的特定字段值以Integer對象返回
????public LonggetLong(int?col) 將當前記錄的特定字段值以Long對象返回
????public StringgetText(int?col) 將當前記錄的特定字段值以Text對象返回
????public StringgetString(int?col) 將當前記錄的特定字段值以String對象返回
????...等等

2、Interface Query
????Query接口封裝了對數(shù)據(jù)庫的查詢等操作,在這里,我們使用到它的原因是在于它的scroll()方法可以返回一個ScrollableResults實例:
????public ScrollableResultsscroll() 將查詢結(jié)果以ScrollableResults實例返回,但需要注意的是查詢返回的結(jié)果其實只是一些id,當需要的時候(比如我們使用ScrollableResults.next()方法后移游標時)這條需要用到的記錄才會被真正初始化(這種技術(shù)可以稱作:延時初始化)

3、Interface Session
????Session是Hibernate的核心中的核心,通過Session的createQuery()方法,我們能生成一個Query實例:
????public QuerycreateQuery(String?queryString) 用給出的HQL查詢串創(chuàng)建一個Query實例

好了,了解了上面的三個接口,問題就能夠很好的解決了。需要如下幾個文件:
Customer.java????????????????????????????PO對象
Charge.java????????????????????????????????PO對象
TotalCharge.java????????????????????????用于保存統(tǒng)計結(jié)果Bean
Customer.hbm.xml??????????????????????PO映射
Charge.hbm.xml??????????????????????????PO映射
TotalChargeDao.java??????????????????統(tǒng)計Dao定義
TotalChargeDaoImpl.java???????????統(tǒng)計Dao定義實現(xiàn)
DaoFactory.java???????????????????????? Dao工廠
HibernateSessionFactory.java?????Session工廠

因為這里主要討論的重點是對Customer和Charge的聯(lián)合查詢,所以Customer.java、Charge.java、Customer.hbm.xml、Charge.hbm.xml四個文件以及TotalChargeDao.java、DaoFactory.java、HibernateSessionFactory.java的源代碼在這里省略掉。

TotalCharge.java 的源代碼:
package test.bean;

/**
?*作者:孫星
?**/
public class TotalCharge {
? private String name;
? private Double fee;
? private java.util.Date chargeTimeBegin;
? private java.util.Date chargeTimeEnd;
? public TotalCharge() {
? }

? public String getName() {
??? return name;
? }

? public TotalCharge(String name, Double fee, java.util.Date chargeTimeBegin,
???????????????????? java.util.Date chargeTimeEnd) {
??? this.name = name;
??? this.fee = fee;
??? this.chargeTimeBegin = chargeTimeBegin;
??? this.chargeTimeEnd = chargeTimeEnd;
? }

? public void setName(String name) {
??? this.name = name;
? }

? public Double getFee() {
??? return fee;
? }

? public void setFee(Double fee) {
??? this.fee = fee;
? }

? public java.util.Date getChargeTimeBegin() {
??? return chargeTimeBegin;
? }

? public void setChargeTimeBegin(java.util.Date chargeTimeBegin) {
??? this.chargeTimeBegin = chargeTimeBegin;
? }

? public java.util.Date getChargeTimeEnd() {
??? return chargeTimeEnd;
? }

? public void setChargeTimeEnd(java.util.Date chargeTimeEnd) {
??? this.chargeTimeEnd = chargeTimeEnd;
? }
}


TotalChargeDaoImpl.java 代碼:
package test.dao.impl;

import java.util.*;
import test.bean.*;
import test.dao.*;
import net.sf.hibernate.*;

/**
?*作者:孫星
?**/
public class TotalChargeDaoImple extends TotalChargeDao{
????
????//下面方法集成自TotalChargeDao
????public List statTotalCharge(Date statTimeBegin, Date statTimeEnd) throws DaoException{
????????List res = new Vector();//將用于存放保存的結(jié)果集合
????????Session session = null;
????????ScrollableResults srs?= null;
????????try{
????????????session = HibernateSessionFactory.openSession();//得到一個Hibernate Session
????????????//下面創(chuàng)建一個匿名Query實例并調(diào)用它的scroll()方法返回以ScrollableResults形式組織的查詢結(jié)果
????????????srs = session.createQuery(“select b.name, count(a.fee) mix(a.chargeBeginTime) max(a.chargeEndTime) from charge a, customer b where a.idCustomer = b.idCustomer and a.chargeBeginTime >=?? and a.chargeEndTime <?? gourp by a.idCustomer“).setDate(0, statTimeBegin).setDate(1, statTimeEnd).scroll();
????????????//將查詢結(jié)果放入List保存
????????????while(srs.next()){
????????????????res.add(new TotalCharge(srs.getString(0), srs,getDouble(1), srs.getDate(2), srs.getDate(3)));
????????????}
????????}catch(HibernateException he){
????????????;//loging err.....
????????????if(srs!=null){
????????????????try{
????????????????????srs.close();
????????????????}catch(Exception e){
????????????????????;
????????????????}
????????????}
????????}finally{
????????????try{
????????????????session.close();
????????????}catch(Exception e){
????????????????;
????????????}
????????}
????????return res;
????}
}

????看,現(xiàn)在問題解決了。坐下來,喝杯Java吧!?



天外飛仙 2007-03-31 21:20 發(fā)表評論
]]>
關(guān)于hibernate中保存Blob數(shù)據(jù)的問題http://www.tkk7.com/songfei/articles/107685.html天外飛仙天外飛仙Sat, 31 Mar 2007 13:18:00 GMThttp://www.tkk7.com/songfei/articles/107685.htmlhttp://www.tkk7.com/songfei/comments/107685.htmlhttp://www.tkk7.com/songfei/articles/107685.html#Feedback0http://www.tkk7.com/songfei/comments/commentRss/107685.htmlhttp://www.tkk7.com/songfei/services/trackbacks/107685.html關(guān)于hibernate中保存Blob數(shù)據(jù)的問題

你可以跟蹤一下程序,看看到//2的位置時,取出的pic.getRawstream()是什么類型

pic.getRawstream()的類型是org.hibernate.lob.SerializableBlob

(oracle.sql.BLOB) 那你用這個轉(zhuǎn)型肯定會ClassCastException

你查一下SerializableBlob的API,看看這個有沒有其他的轉(zhuǎn)換方法

oracle.sql.BLOB blob = (org.hibernate.lob.SerializableBlob)pic.getRawstream();//2
OutputStream os = blob.setBinaryStream(long pos);

SerializableBlob的setBinaryStream(long pos) 方法就是返回你所需要的OutputStream

但是這個long參數(shù)不知道該傳什么,API上沒有明確指明


http://www.hibernate.org/hib_docs/v3/api/org/hibernate/lob/SerializableBlob.html#setBinaryStream(long)



天外飛仙 2007-03-31 21:18 發(fā)表評論
]]>
MyEclipse+struts+Hibernate配置和開發(fā)手冊http://www.tkk7.com/songfei/articles/100703.html天外飛仙天外飛仙Mon, 26 Feb 2007 03:13:00 GMThttp://www.tkk7.com/songfei/articles/100703.htmlhttp://www.tkk7.com/songfei/comments/100703.htmlhttp://www.tkk7.com/songfei/articles/100703.html#Feedback0http://www.tkk7.com/songfei/comments/commentRss/100703.htmlhttp://www.tkk7.com/songfei/services/trackbacks/100703.html

說明:
??? 這個手冊只是為初學(xué)者制作的環(huán)境配置和快速開發(fā)的一些基本方法,為的是廣大愛好者能快速上手,少走我走過的彎路,里面沒有任何關(guān)于java模式和其他相關(guān)的說明。本人水平有限,也沒有能力去討論關(guān)于模式設(shè)計和開發(fā)細節(jié)的一些內(nèi)容。

建議:
??? 如果你還不清楚struts和hibernate的一些基本原理,希望能先去了解一下這方面的相關(guān)內(nèi)容。

推薦:
??? 《Hibernate中文手冊》作者認為要學(xué)Hibernate看這個就足夠了,里面幾乎包括了所有的細節(jié),不過可能不太適合快速入門。
地址:http://www.hibernate.org/hib_docs/v3/reference/zh- cn/html_single/
??? 關(guān)于struts的資料就很多了,這里推薦一個可以下載一些入門教程的網(wǎng)站。
地址:http://www.wnetw.com/jclub/index.jsp
&nbs p;?? 強烈建議入門的朋友先了解一下基本的原理!否則本文章可能對你沒有任何幫助。

相關(guān)工具下載:(注意版本)
????mysql5.0 http://www.mysql.org
??? eclipse 3.1.1 http://www.eclipse.org
??? myeclipse4.0.3 http://www.myeclipseide.com
???&nb sp;tomcat5.5

安裝:
??? 關(guān)于tomcat和mysql的安裝就不多說了,需要注意的是最好保證你的 jdk是1.5的版本,并配置好你的環(huán)境變量,不然可能會遇到一些問題。
?把eclipse解開,再去安裝剛下載的myeclipse,在安裝的時候需要把路徑指定到剛才解開的eclipse上,由于myeclipse是個收費軟件,所以需要注冊。不過一般按照Chinese的習(xí)慣,去google一個注冊碼就可以了:}

開發(fā)環(huán)境部署:
?好了,現(xiàn)在保證你的mysql和tomcat服務(wù)能夠正常啟動,myeclipse能夠正常打開(如果不能,可以去找一下相關(guān)的說明或者給作者留言)。下面我們就要開始真正的開始部署一個傳說中的tomcat+struts+hibernate+mysql結(jié)構(gòu)的工程了!(faint!前言就寫的我好累)
?首先,在myeclipse里新建一個工程。在左邊的Package Exporler面版里點右鍵選擇new->project…
?在跳出菜單里選擇MyEclipse->J2EE Projects->Web Project。
?點擊next后進入如下畫面:

?工程名為:test
?結(jié)束后點擊Finish。
?好了,如果成功的話你就會在 Package Exporler里看到一個新的test工程!現(xiàn)在我們先配置一下數(shù)據(jù)庫方面的東西。首先在你的mysql 里建立一個數(shù)據(jù)庫webases,再在里面新建一個表admin,里面三個字段分別為id,name,password其中id為自動取值的主鍵(mysql具體的操作可以自己找資料,不是本文涉及范圍)。
?再回到myeclipse ,選中window->Open Perspective->Other…
?可以看到現(xiàn)在跳出一個名為Select Perspective的菜單,在里面選中MyEclipse Databases Exporler,可以看到現(xiàn)在到了下面的頁面。

按以上圖示輸入相關(guān)字段后點擊Finish便建立了一個數(shù)據(jù)庫連接,在新出現(xiàn)的JDBC for Mysql上點右鍵,選擇Open connection…,確認用戶名和密碼正確后點OK,如果一切順利的話你會看到下面的畫面:

?這說明你已經(jīng)和數(shù)據(jù)庫建立了正確的連接。現(xiàn)在我們再回到window->Open Perspective- >Other…里的MyEclipse,也就是我們剛進來的時候看到的畫面。
?右鍵點擊你剛建立的工程 test并選擇MyEclipse->Add struts Capabilities…在跳出的菜單里按照如下輸入并確定:

?好了,現(xiàn)在你已經(jīng)為你的工程增加了struts,接下來和上面一樣在右鍵工程后選擇MyEclipse- >Add Hibernate Capabilities…一路確定下來為你的工程添加Hibernate。(為方便起見我們在選擇路徑時把HibernateSessionFactory.java放在了src/com下面,其實最好建立個單獨的目錄如 src/com/hibernate)
?為了更好的演示我們不建立通常的登陸頁面而是建立個注冊頁面。選擇 src目錄下的hibernate.cfg.xml文件。照如下填寫并保存。這樣hibernate就為你建立了數(shù)據(jù)庫的連接池。

?下面我們再選擇WebRoot/WEB-INF/struts-config.xml文件,在畫面中點擊右鍵選擇new- >Form, Action and JSP。如下填寫

?再選擇JSP選項,如下

?最后選擇Finish。
?再新建一個一個success.jsp的頁面,
?在剛才struts- config.xml文件里右鍵選擇addAdmin選擇Properties,在菜單里選擇Forwords,再點add,如下圖填寫

?最后你的struts-config.xml就是下面這個樣子:


?下面我們轉(zhuǎn)到hibernate。換到剛才我們建立數(shù)據(jù)庫的頁面,選擇你的admin的表點右鍵選擇Create Hibernate Mapping。選擇好打包路徑后選擇Finish。如圖:

?在你剛才選擇的路徑下(我為方便是src/com/yourcompanyname/)下新建立的文件 AdminDAOFactory.java文件并輸入以下內(nèi)容:

package com.yourcompanyname;

import java.util.Iterator;

import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

import com.hibernate.SessionFactory;

public class AdminDAOFactory {
?Session session;
?Transaction tx;
?public void add(Admin admin) throws HibernateException {
??/**
?? * Creation Date: 11-17-2005
?? * TODO Add a new admin user.
?? * @param An object of Admin
?? * @return void
?? * @author Coder Guo
?? */
??try {
???session = SessionFactory.currentSession();
???tx = session.beginTransaction();
???//Add a new admin
???session.save(admin);
???tx.commit ();
??}catch(HibernateException e){
???throw e;
??}finally{
???if (tx!=null) {
????tx.rollback();
???}
???SessionFactory.closeSession();
??}
?}
}

?再打開com.yourcompany.struts.action下的AddAdminAction.java添加(其中如果有錯誤選中好按ctrl+shift+o自動添加包)

public class AddAdminAction extends Action {

?// --------------------------------------------------------- Instance Variables

?// --------------------------------------------------------- Methods

?/**
? * Method execute
? * @param mapping
? * @param form
? * @param request
? * @param response
? * @return ActionForward
? * @author Coder Guo
? */
?public ActionForward execute(
??ActionMapping mapping,
??ActionForm form,
??HttpServletRequest request,
??HttpServletResponse response) {
??AddAdminForm addAdminForm = (AddAdminForm) form;
??
??// TODO Add a new admin
??Admin admin = new Admin();
??admin.setName(addAdminForm.getName ());
??admin.setPassword(addAdminForm.getPassword ());
??AdminDAOFactory adminDAO = new AdminDAOFactory ();
??adminDAO.add(admin);
??
??return mapping.findForward("success");
?}

}

?再打開com.yourcompanyname.struts.form下的AddAdminForm.java,修改(如果有錯誤按照上面說的方法導(dǎo)入包)
?public ActionErrors validate(
??ActionMapping mapping,
??HttpServletRequest request) {

??// TODO Auto-generated method stub
??ActionErrors errors = new ActionErrors();
??
??Session session = SessionFactory.currentSession();
??Transaction tx = session.beginTransaction ();
??Query query = session.createQuery("select admin from Admin as admin where admin.name = '" + this.name + "'");
??Iterator it = query.iterate ();
??if (it.hasNext()){
???errors.add ("addAdmin.err.name",new ActionMessage("form.addAdmin.err.name"));
??}
??tx.commit();
??SessionFactory.closeSession ();
??return errors;
?}

?public void reset(ActionMapping mapping, HttpServletRequest request) {

??// TODO Auto-generated method stub
??this.name=null;
??this.password=null;
?}

再打開com\yourcompanyname\struts下的ApplicationResource.properties在這里面添加錯誤信息:
Form.addAdmin.err.name=err

最后,(汗,好累啊-_-!)打開addAdmin.jsp修改成如下:
<%@ page contentType="text/html; charset=utf-8"%>
<%@ page language="java"%>
<%@ taglib uri="<%@ taglib uri="

<script language = "javascript">
<!--
function check(){
?if (loginForm.userName.value == "" || loginForm.password.value == ""){
??alert("請輸入完整的信息!");
??loginForm.userName.focus();
??return false;
?}
}
//-->
</script>
?
?<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html:html>
? <head>
??? <html:base />
???
??? <title>login.jsp</title>
??? <link href="css/webcss.css" rel="stylesheet" type="text/css">
???
??? <meta http-equiv="pragma" content="no- cache">
??? <meta http-equiv="cache-control" content="no- cache">
??? <meta http-equiv="expires" content="0">???
??? <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
??? <meta http- equiv="description" content="This is my page">
? </head>
?

? <body>
? <center>
? ?<p>&nbsp;</p>
? ?<p>&nbsp;</p>
? ?<table width="300" border="0" cellpadding="0" cellspacing="0">
? ?<html:form action="/addAdmin" focus="name" method="GET">
??? ?<tr align="center" valign="middle">
????? ?<td colspan="2" class="typt_normal">新增管理員</td>
??? ?</tr>
??? ?<tr>
????? ?<td width="100" align="center" valign="middle" class="typt_normal">名稱: </td>
????? ?<td width="200" align="left"><html:text property="name" styleClass="text_s"/><html:errors property="addAdmin.err.name"/></td>
??? ?</tr>
??? ?<tr>
????? ?<td width="100" align="center" valign="middle" class="typt_normal">密碼: </td>
????? ?<td width="200" align="left"><html:password property="password" styleClass="text_s"/></td>
??? ?</tr>
??? ?<tr>?
????? ?<td colspan="2" align="center" valign="middle"><html:submit value="提交" onclick="return check ();"/><html:reset value="重置"></html:reset></td>
????? ?</tr>
?</html:form>
? ?</table>
?</center>
?</body>

</html:html>
其中可以看到如何在struts的標簽中使用javascript的方法。
?配置好myeclipse于tomcat的連接。在window->Preferences做如下設(shè)定:

?在項目文件點右鍵->“myeclipse”->“Add and remove project deployment”,如下圖:

?好了,我們的配置工作基本結(jié)束了,在myeclipse上開啟tomcat服務(wù)

現(xiàn)在打開瀏覽器,輸入
http://127.0.0.1:8080/test/addAdmin.jsp就可以看到你的jsp頁面了!








天外飛仙 2007-02-26 11:13 發(fā)表評論
]]>
Hibernate 的原理與配置快速入門http://www.tkk7.com/songfei/articles/42169.html天外飛仙天外飛仙Thu, 20 Apr 2006 07:15:00 GMThttp://www.tkk7.com/songfei/articles/42169.htmlhttp://www.tkk7.com/songfei/comments/42169.htmlhttp://www.tkk7.com/songfei/articles/42169.html#Feedback0http://www.tkk7.com/songfei/comments/commentRss/42169.htmlhttp://www.tkk7.com/songfei/services/trackbacks/42169.htmlHibernate 的原理與配置快速入門
在本文中,我向大家重點介紹Hibernate的核心API調(diào)用庫,并講解一下它的基本配置

  也許你聽說過Hibernate的大名,但可能一直不了解它,也許你一直渴望使用它進行開發(fā),那么本文正是你所需要的!在本文中,我向大家重點介紹Hibernate的核心API調(diào)用庫,并講解一下它的基本配置。

  看完本文后,我相信你對什么是ORM(對像/關(guān)系映射)以及它的優(yōu)點會有一個深刻的認識,我們先通過一個簡單的例子開始來展現(xiàn)它的威力。

  正如一些傳統(tǒng)的經(jīng)典計算機文章大都會通過一個“hello,world”的例子開始講解一樣,我們也不例外,我們也將從一個相對簡單的例子來闡述Hibernate的開發(fā)方法,但如果要真正闡述Hibernate的一些重要思想,僅僅靠在屏幕上打印一些字符是遠遠不夠的,在我們的示例程序中,我們將創(chuàng)建一些對象,并將其保存在數(shù)據(jù)庫中,然后對它們進行更新和查詢。

閱讀導(dǎo)航
“Hello World”Hello world”示例程序讓您對Hibernate有一個簡單的認識
理解Hibernate的架構(gòu)介紹Hibernate接口的主要功能。
核心接口Hibernate有5個核心接口,通過這幾個接口開發(fā)人員可以存儲和獲得持久對象,并且能夠進行事務(wù)控制
一個重要的術(shù)語:TypeType是Hibernate發(fā)明者發(fā)明的一個術(shù)語,它在整個構(gòu)架中是一個非常基礎(chǔ)、有著強大功能的元素,一個Type對象能將一個Java類型映射到數(shù)據(jù)庫中一個表的字段中去。
策略接口Hibernate與某些其它開源軟件不同的還有一點――高度的可擴展性,這通過它的內(nèi)置策略機制來實現(xiàn)。
基礎(chǔ)配置Hibernate可以配置成可在任何Java環(huán)境中運行,一般說來,它通常被用在2-3層的C/S模式的項目中,并被部署在服務(wù)端
創(chuàng)建一個SessionFactory對象要創(chuàng)建一個SessionFactory對象,必須在Hibernate初始化時創(chuàng)建一個Configuration類的實例,并將已寫好的映射文件交由它處理。

Hibernate 的原理與配置快速入門

作者:羅小虎編譯出處:天極網(wǎng)責任編輯: 方舟 [ 2004-10-26 16:22 ]
在本文中,我向大家重點介紹Hibernate的核心API調(diào)用庫,并講解一下它的基本配置

  “Hello World”

  Hibernate應(yīng)用程序定義了一些持久類,并且定義了這些類與數(shù)據(jù)庫表格的映射關(guān)系。在我們這個“Hello world”示例程序中包含了一個類和一個映射文件。讓我們看看這個簡單的持久類包含有一些什么?映射文件是怎樣定義的?另外,我們該怎樣用Hibernate來操作這個持久類。

  我們這個簡單示例程序的目的是將一些持久類存儲在數(shù)據(jù)庫中,然后從數(shù)據(jù)庫取出來,并將其信息正文顯示給用戶。其中Message正是一個簡單的持久類:,它包含我們要顯示的信息,其源代碼如下:

  列表1 Message.Java 一個簡單的持久類

package hello;
public class Message {
 private Long id;
 private String text;
 private Message nextMessage;
 private Message() {}
 public Message(String text) {
  this.text = text;
 }
 public Long getId() {
  return id;
 }
 private void setId(Long id) {
  this.id = id;
 }
 public String getText() {
  return text;
 }
 public void setText(String text) {
  this.text = text;
 }
 public Message getNextMessage() {
  return nextMessage;
 }
 public void setNextMessage(Message nextMessage) {
  this.nextMessage = nextMessage;
 }
}

  Message類有三個屬性:Message的id 、消息正文、以及一個指向下一條消息的指針。其中id屬性讓我們的應(yīng)用程序能夠唯一的識別這條消息,通常它等同于數(shù)據(jù)庫中的主鍵,如果多個Message類的實例對象擁有相同的id,那它們代表數(shù)據(jù)庫某個表的同一個記錄。在這里我們選擇了長整型作為我們的id值,但這不是必需的。Hibernate允許我們使用任意的類型來作為對象的id值,在后面我們會對此作詳細描述。

  你可能注意到Message類的代碼類似于JavaBean的代碼風格,并且它有一個沒有參數(shù)的構(gòu)造函數(shù),在我們以后的代碼中我將繼續(xù)使用這種風格來編寫持久類的代碼。

  Hibernate會自動管理Message類的實例,并通過內(nèi)部機制使其持久化,但實際上Message對象并沒有實現(xiàn)任何關(guān)于Hibernate的類或接口,因此我們也可以將它作為一個普通的Java類來使用:

Message message = new Message("Hello World");
System.out.println( message.getText() );

  以上這段代碼正是我們所期望的結(jié)果:它打印“hello world”到屏幕上。但這并不是我們的最終目標;實際上Hibernate與諸如EJB容器這樣的環(huán)境在持久層實現(xiàn)的方式上有很大的不同。我們的持久類(Message類)可以用在與容器無關(guān)的環(huán)境中,不像EJB必須要有EJB容器才能執(zhí)行。為了能更清楚地表現(xiàn)這點,以下代碼將我們的一個新消息保存到數(shù)據(jù)庫中去:

Session session = getSessionFactory().openSession();
Transaction tx = session.beginTransaction();
Message message = new Message("Hello World");
session.save(message);
tx.commit();
session.close();

  以上這段代碼調(diào)用了Hibernate的Session和Transaction接口(關(guān)于getSessionFactory()方法我們將會馬上提到)。它相當于我們執(zhí)行了以下SQL語句:

insert into MESSAGES (MESSAGE_ID, MESSAGE_TEXT, NEXT_MESSAGE_ID)
values (1, 'Hello World', null)

  在以上的SQL語句中,MESSAGE_ID字段到底被初始化成了什么值呢?由于我們并沒有在先前的代碼中為message對象的id屬性賦與初始值,那它是否為null呢?實際上Hibernate對id屬性作了特殊處理:由于它是一個對象的唯一標識,因此當我們進行save()調(diào)用時,Hibernate會為它自動賦予一個唯一的值(我們將在后面內(nèi)容中講述它是如何生成這個值的)。

  我們假設(shè)你已經(jīng)在數(shù)據(jù)庫中創(chuàng)建了一個名為MESSAGE的表,那么既然前面這段代碼讓我們將Message對象存入了數(shù)據(jù)庫中,那么現(xiàn)在我們就要將它們一一取出來。下面這段代碼將按照字母順序,將數(shù)據(jù)庫中的所有Message對象取出來,并將它們的消息正文打印到屏幕上:

Session newSession = getSessionFactory().openSession();
Transaction newTransaction = newSession.beginTransaction();
List messages =newSession.find("from Message as m order by m.text asc");
System.out.println( messages.size() + " message(s) found:" );
for ( Iterator iter = messages.iterator(); iter.hasNext(); ) {
 Message message = (Message) iter.next();
 System.out.println( message.getText() );
}
newTransaction.commit();
newSession.close();

  在以上這段代碼中,你可能被find()方法的這個參數(shù)困擾著:"from Message as m order by m.text asc",其實它是Hibernate自己定義的查詢語言,全稱叫Hibernate Query Language(HQL)。通俗地講HQL與SQL的關(guān)系差不多就是方言與普通話之間的關(guān)系,咋一看,你會覺得它有點類似于SQL語句。其實在find()調(diào)用時,Hibernate會將這段HQL語言翻譯成如下的SQL語句:

select m.MESSAGE_ID, m.MESSAGE_TEXT, m.NEXT_MESSAGE_ID
from MESSAGES m
order by m.MESSAGE_TEXT asc

  以下就是運行結(jié)果:

1 message(s) found:
Hello World

  如果你以前沒有ORM(對象-關(guān)系映射)的開發(fā)經(jīng)驗,那你可能想在代碼的某個地方去尋找這段SQL語句,但在Hibernate中你可能會失望:它根本不存在!所有就SQL語句都是Hibernate動態(tài)生成的。

  也許你會覺得還缺點什么,對!僅憑以上代碼Hibernate是無法將我們的Message類持久化的。我們還需要一些更多的信息,這就是映射定義表!這個表在Hibernate中是以XML格式來體現(xiàn)的,它定義了Message類的屬性是怎樣與數(shù)據(jù)庫中的MESSAGES表的字段進行一一對應(yīng)的,列表2是這個示例程序的映射配置文件清單:

  列表2:示例程序的對象-關(guān)系映射表

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping>
<class name="hello.Message" table="MESSAGES">
 <id name="id" column="MESSAGE_ID">
  <generator class="increment"/>
 </id>
 <property name="text" column="MESSAGE_TEXT"/>
 <many-to-one name="nextMessage" cascade="all" column="NEXT_MESSAGE_ID"/>
</class>
</hibernate-mapping>

  以上這個文檔告訴Hibernate怎樣將Message類映射到MESSAGES表中,其中Message類的id屬性與表的MESSAGE_ID字段對應(yīng),text屬性與表的MESSAGE_TEXT字段對應(yīng),nextMessage屬性是一個多對一的關(guān)系,它與表中的NEXT_MESSAGE_ID相對應(yīng)。

  相對于有些開源項目來說,Hibernate的配置文件其實是很容易理解的。你可以輕松地修改與維護它。只要你定義好了持久類與數(shù)據(jù)庫中表字段的對應(yīng)關(guān)系就行了,Hibernate會自動幫你生成SQL語句來對Message對象進行插入、更新、刪除、查找工作,你可以不寫一句SQL語句,甚至不需要懂得SQL語言!

  現(xiàn)在讓我們做一個新的試驗,我們先取出第一個Message對象,然后修改它的消息正文,最后我們再生成一個新的Message對象,并將它作為第一個Message對象的下一條消息,其代碼如下:

  列表3 更新一條消息

Session session = getSessionFactory().openSession();
Transaction tx = session.beginTransaction();
// 1 is the generated id of the first message
Message message =(Message) session.load( Message.class, new Long(1) );
message.setText("Greetings Earthling");
Message nextMessage = new Message("Take me to your leader (please)");
message.setNextMessage( nextMessage );
tx.commit();
session.close();

  以上這段代碼在調(diào)用時,Hibernate內(nèi)部自動生成如下的SQL語句:

select m.MESSAGE_ID, m.MESSAGE_TEXT, m.NEXT_MESSAGE_ID
from MESSAGES m
where m.MESSAGE_ID = 1

insert into MESSAGES (MESSAGE_ID, MESSAGE_TEXT, NEXT_MESSAGE_ID)
values (2, 'Take me to your leader (please)', null)

update MESSAGES
set MESSAGE_TEXT = 'Greetings Earthling', NEXT_MESSAGE_ID = 2
where MESSAGE_ID = 1

  當?shù)谝粋€Message對象的text屬性和nextMessage被程序修改時,請注意Hibernate是如何檢測到這種變化,并如何在數(shù)據(jù)庫中自動對它更新的。這實際上是Hibernate的一個很有價值的特色,我們把它稱為“自動臟數(shù)據(jù)檢測”,Hibernate的這個特色使得當我們修改一個持久對象的屬性后,不必顯式地通知Hibernate去將它在數(shù)據(jù)庫中進行更新。同樣的,當?shù)谝粋€Message對象調(diào)用setNextMessage()方法將第二個Message對象作為它的下一條消息的引用時,第二條消息會無需調(diào)用save()方法,便可以自動地保存在數(shù)據(jù)庫中。這種特色被稱為“級聯(lián)保存”,它也免去了我們顯式地對第二個Message對象調(diào)用save()方法之苦。

  如果我們再運行先前的那段將數(shù)據(jù)庫中所有的Message對象都打印出來的代碼,那它的運行結(jié)果如下:

2 message(s) found:
Greetings Earthling
Take me to your leader (please)

  “Hello world”示例程序現(xiàn)在介紹完畢。我們總算對Hibernate有了一個簡單的認識,下面我們將回過頭來,對Hibernate的主要API調(diào)用作一下簡要的介紹:

 理解Hibernate的架構(gòu)

  當你想用Hibernate開發(fā)自己的基于持久層的應(yīng)用時,第一件事情應(yīng)當是熟悉它的編程接口。Hibernate的API接口設(shè)計得盡量簡潔明了,以方便開發(fā)人員。然而實際上由于ORM的復(fù)雜性,它的API一般都不可能設(shè)計得很簡單。但是別擔心,你沒有必要一下子了解所有的Hibernate的API接口。下面這張圖描述了Hibernate在應(yīng)用層和持久層中的一些重要的接口類:


  在上圖中,我們將應(yīng)用層放在了持久層的上部,實際上在傳統(tǒng)的項目中,應(yīng)用層充當著持久層的一個客戶端角色。但對于一些簡單的項目來說,應(yīng)用層和持久層并沒有區(qū)分得那么清楚,這也沒什么,在這種情況下你可以將應(yīng)用層和持久層合并成了一層。

  在上圖中,Hibernate的接口大致可以分為以下幾種類型:

  · 一些被用戶的應(yīng)用程序調(diào)用的,用來完成基本的創(chuàng)建、讀取、更新、刪除操作以及查詢操作的接口。這些接口是Hibernate實現(xiàn)用戶程序的商業(yè)邏輯的主要接口,它們包括Session、Transaction和Query。

  · Hibernate用來讀取諸如映射表這類配置文件的接口,典型的代表有Configuration類。

  · 回調(diào)(Callback)接口。它允許應(yīng)用程序能對一些事件的發(fā)生作出相應(yīng)的操作,例如Interceptor、Lifecycle和Validatable都是這一類接口。

  · 一些可以用來擴展Hibernate的映射機制的接口,例如UserType、CompositeUserType和IdentifierGenerator。這些接口可由用戶程序來實現(xiàn)(如果有必要)。

  Hibernate使用了J2EE架構(gòu)中的如下技術(shù):JDBC、JTA、JNDI。其中JDBC是一個支持關(guān)系數(shù)據(jù)庫操作的一個基礎(chǔ)層;它與JNDI和JTA一起結(jié)合,使得Hibernate可以方便地集成到J2EE應(yīng)用服務(wù)器中去。

  在這里,我們不會詳細地去討論Hibernate API接口中的所有方法,我們只簡要講一下每個主要接口的功能,如果你想了解得更多的話,你可以在Hibernate的源碼包中的net.sf.hibernate子包中去查看這些接口的源代碼。下面我們依次講一下所有的主要接口:

  核心接口

  以下5個核心接口幾乎在任何實際開發(fā)中都會用到。通過這些接口,你不僅可以存儲和獲得持久對象,并且能夠進行事務(wù)控制。

  Session接口

  Session接口對于Hibernate 開發(fā)人員來說是一個最重要的接口。然而在Hibernate中,實例化的Session是一個輕量級的類,創(chuàng)建和銷毀它都不會占用很多資源。這在實際項目中確實很重要,因為在客戶程序中,可能會不斷地創(chuàng)建以及銷毀Session對象,如果Session的開銷太大,會給系統(tǒng)帶來不良影響。但值得注意的是Session對象是非線程安全的,因此在你的設(shè)計中,最好是一個線程只創(chuàng)建一個Session對象。

  在Hibernate的設(shè)計者的頭腦中,他們將session看作介于數(shù)據(jù)連接與事務(wù)管理一種中間接口。我們可以將session想象成一個持久對象的緩沖區(qū),Hibernate能檢測到這些持久對象的改變,并及時刷新數(shù)據(jù)庫。我們有時也稱Session是一個持久層管理器,因為它包含這一些持久層相關(guān)的操作,諸如存儲持久對象至數(shù)據(jù)庫,以及從數(shù)據(jù)庫從獲得它們。請注意,Hibernate 的session不同于JSP應(yīng)用中的HttpSession。當我們使用session這個術(shù)語時,我們指的是Hibernate中的session,而我們以后會將HttpSesion對象稱為用戶session。

  SessionFactory 接口

  這里用到了一個設(shè)計模式――工廠模式,用戶程序從工廠類SessionFactory中取得Session的實例。

  令你感到奇怪的是SessionFactory并不是輕量級的!實際上它的設(shè)計者的意圖是讓它能在整個應(yīng)用中共享。典型地來說,一個項目通常只需要一個SessionFactory就夠了,但是當你的項目要操作多個數(shù)據(jù)庫時,那你必須為每個數(shù)據(jù)庫指定一個SessionFactory。
SessionFactory在Hibernate中實際起到了一個緩沖區(qū)的作用,它緩沖了Hibernate自動生成的SQL語句和一些其它的映射數(shù)據(jù),還緩沖了一些將來有可能重復(fù)利用的數(shù)據(jù)。

  Configuration 接口

  Configuration接口的作用是對Hibernate進行配置,以及對它進行啟動。在Hibernate的啟動過程中,Configuration類的實例首先定位映射文檔的位置,讀取這些配置,然后創(chuàng)建一個SessionFactory對象。

  雖然Configuration接口在整個Hibernate項目中只扮演著一個很小的角色,但它是啟動hibernate時你所遇到的每一個對象。

  Transaction 接口

  Transaction接口是一個可選的API,你可以選擇不使用這個接口,取而代之的是Hibernate的設(shè)計者自己寫的底層事務(wù)處理代碼。 Transaction接口是對實際事務(wù)實現(xiàn)的一個抽象,這些實現(xiàn)包括JDBC的事務(wù)、JTA中的UserTransaction、甚至可以是CORBA事務(wù)。之所以這樣設(shè)計是能讓開發(fā)者能夠使用一個統(tǒng)一事務(wù)的操作界面,使得自己的項目可以在不同的環(huán)境和容器之間方便地移值。

  Query和Criteria接口

  Query接口讓你方便地對數(shù)據(jù)庫及持久對象進行查詢,它可以有兩種表達方式:HQL語言或本地數(shù)據(jù)庫的SQL語句。Query經(jīng)常被用來綁定查詢參數(shù)、限制查詢記錄數(shù)量,并最終執(zhí)行查詢操作。

  Criteria接口與Query接口非常類似,它允許你創(chuàng)建并執(zhí)行面向?qū)ο蟮臉藴驶樵儭?br />
  值得注意的是Query接口也是輕量級的,它不能在Session之外使用。

  Callback 接口

  當一些有用的事件發(fā)生時――例如持久對象的載入、存儲、刪除時,Callback接口會通知Hibernate去接收一個通知消息。一般而言,Callback接口在用戶程序中并不是必須的,但你要在你的項目中創(chuàng)建審計日志時,你可能會用到它。
一個重要的術(shù)語:Type

  Hibernate的設(shè)計者們發(fā)明了一個術(shù)語:Type,它在整個構(gòu)架中是一個非常基礎(chǔ)、有著強大功能的元素。一個Type對象能將一個Java類型映射到數(shù)據(jù)庫中一個表的字段中去(實際上,它可以映射到表的多個字段中去)。持久類的所有屬性都對應(yīng)一個type。這種設(shè)計思想使用Hibernate有著高度的靈活性和擴展性。

  Hibernate內(nèi)置很多type類型,幾乎包括所有的Java基本類型,例如Java.util.Currency、Java.util.calendar、byte[]和Java.io.Serializable。

  不僅如此,Hibernate還支持用戶自定義的type,通過實現(xiàn)接口UserType和接口CompositeUserType,你可以加入自己的type。你可以利用這種特色讓你的項目中使用自定義的諸如Address、Name這樣的type,這樣你就可以獲得更大的便利,讓你的代碼更優(yōu)雅。自定義type在Hibernate中是一項核心特色,它的設(shè)計者鼓勵你多多使用它來創(chuàng)建一個靈活、優(yōu)雅的項目!

  策略接口

  Hibernate與某些其它開源軟件不同的還有一點――高度的可擴展性,這通過它的內(nèi)置策略機制來實現(xiàn)。當你感覺到Hibernate的某些功能不足,或者有某些缺陷時,你可以開發(fā)一個自己的策略來替換它,而你所要做的僅僅只是繼承它的某個策略接口,然后實現(xiàn)你的新策略就可以了,以下是它的策略接口:

  · 主鍵的生成 (IdentifierGenerator 接口)

  · 本地SQL語言支持 (Dialect 抽象類)

  · 緩沖機制 (Cache 和CacheProvider 接口)

  · JDBC 連接管理 (ConnectionProvider接口)

  · 事務(wù)管理 (TransactionFactory, Transaction, 和 TransactionManagerLookup 接口)

  · ORM 策略 (ClassPersister 接口)

  · 屬性訪問策略 (PropertyAccessor 接口)

  · 代理對象的創(chuàng)建 (ProxyFactory接口)

  Hibernate為以上所列的機制分別創(chuàng)建了一個缺省的實現(xiàn),因此如果你只是要增強它的某個策略的功能的話,只需簡單地繼承這個類就可以了,沒有必要從頭開始寫代碼。

  以上就是Hibernate的一些核心接口,但當我們真正開始用它進行開發(fā)時,你的腦海里可能總會有一個疑問:我是通過什么方式,并從哪里取得Session的呢?以下我們就解答這個問題。

  基礎(chǔ)配置

  現(xiàn)在回顧一下我們先前的內(nèi)容:我們寫出了一個示例程序,并簡要地講解了Hibernate的一些核心類。但要真正使你的項目運行起來,還有一件事必須要做:配置。Hibernate可以配置成可在任何Java環(huán)境中運行,一般說來,它通常被用在2-3層的C/S模式的項目中,并被部署在服務(wù)端。在這種項目中,Web瀏覽器、或Java GUI程序充當者客戶端。盡管我們的焦點主要是集中在多層web應(yīng)用,但實際上在一些基于命令行的應(yīng)用中也可以使用Hibernate。并且,對Hibernate的配置在不同的環(huán)境下都會不同,Hibernate運行在兩種環(huán)境下:可管理環(huán)境和不可管理環(huán)境

  · 可管理環(huán)境――這種環(huán)境可管理如下資源:池資源管理,諸如數(shù)據(jù)庫連接池和,還有事務(wù)管理、安全定義。一些典型的J2EE服務(wù)器(JBoss、Weblogic、WebSphere)已經(jīng)實現(xiàn)了這些。

  · 不可管理環(huán)境――只是提供了一些基本的功能,諸如像Jetty或Tomcat這樣的servlet容器環(huán)境。一個普通的Java桌面應(yīng)用或命令行程序也可以認為是處于這種環(huán)境下。這種環(huán)境不能提供自動事務(wù)處理、資源管理或安全管理,這些都必須由應(yīng)用程序自己來定義。

  Hibernate的設(shè)計者們將這兩種環(huán)境設(shè)計了一個統(tǒng)一的抽象界面,因此對于開發(fā)者來說只有一種環(huán)境:可管理環(huán)境。如果實際項目是建立在諸如Tomcat這類不可管理的環(huán)境中時,那Hibernate將會使用它自己的事務(wù)處理代碼和JDBC連接池,使其變?yōu)橐粋€可管理環(huán)境。
對于可管理的環(huán)境而言,Hibernate會將自己集成在這種環(huán)境中。對于開發(fā)者而言,你所要做的工作非常簡單:只需從一個Configuration類中創(chuàng)建一個SessionFactory類就可以了。

創(chuàng)建一個SessionFactory對象

  為了能創(chuàng)建一個SessionFactory對象,你必須在Hibernate初始化時創(chuàng)建一個Configuration類的實例,并將已寫好的映射文件交由它處理。這樣,Configuration對象就可以創(chuàng)建一個SessionFactory對象,當SessionFactory對象創(chuàng)建成功后,Configuration對象就沒有用了,你可以簡單地拋棄它。如下是示例代碼:

Configuration cfg = new Configuration();
cfg.addResource("hello/Message.hbm.xml");
cfg.setProperties( System.getProperties() );
SessionFactory sessions = cfg.buildSessionFactory();

  在以上代碼中,Message.hb.xml這個映射文件的位置比較特殊,它與當前的classpath相關(guān)。例如classpath包含當前目錄,那在上述代碼中的Message.hbm.xml映射文件就可以保存在當前目錄下的hello目錄中。

  作為一種約定,Hibernate的映射文件默認以.htm.xml作為其擴展名。另一個約定是堅持為每一個持久類寫一個配置文件,想一想如果你將所有持久類的映射寫入一個單獨的配置文件中的話,那這個配置文件肯定非常龐大,不易維護。但這里又出現(xiàn)了一個新問題:如果為每個類寫一個配置文件的話,這么多的配置文件應(yīng)該存放在哪里呢?

  Hibernate推薦你將每個映射文件保存在與持久類相同的目錄下,并且與持久類同名。例如我們第一個示例程序中的Message持久類放在hello目錄下,那你必須在這個目錄下存放名為Message.hbm.xml的映射文件。這樣一個持久類都有自己的一個映射文件,避免了出現(xiàn)像struts項目中的“struts-config.xml地獄”的情況。如果你不遵循這種規(guī)定,那你必須手動地用addResource()方法將一個個的映射文件載入;但你如果遵循這種規(guī)定,那你可以方便地用addClass()方法同時將持久類和它的映射文件載入,以下是體現(xiàn)這種便利性的示例代碼:

SessionFactory sessions = new Configuration()
.addClass(org.hibernate.auction.model.Item.class)
.addClass(org.hibernate.auction.model.Category.class)
.addClass(org.hibernate.auction.model.Bid.class)
.setProperties( System.getProperties() )
.buildSessionFactory();

  當然,Hibernate的映射文件還有很多其它的配置選項,比如數(shù)據(jù)庫連接的設(shè)定,或是能夠改變Hibernate運行時行為的一些設(shè)定。所有的設(shè)置可能是非常龐雜的,足以讓你喘不過氣來,但是不必擔心,因為Hibernate為絕大多數(shù)值都設(shè)定了一個合理缺省值,你只需要修改這些配置文件中的極小一部分值。

  你可以通過以下幾種方式來修改Hibernate的系統(tǒng)配置參數(shù):

  · 將一個Java.util.Properties實例作為參數(shù)傳給Configuration類的setProperties()方法。

  · 在Hibernate啟動時用Java –Dproperty=value的方式設(shè)置值。

  · 在classpath可以找到的路徑下創(chuàng)建一個名為hibernate.properties的配置文件。

  · 在classpath可以找到的路徑下創(chuàng)建一個名為hibernate.cfg.xml的文件,并在其<property>標簽中定義屬性值。

  以上就是對Hibernate的一個大致介紹,如果你想知道得更多,那本文還是遠遠不夠的,我將陸續(xù)推出更多關(guān)于Hibernate的資料。但有一點是毫無疑問的:它的確是一個非常優(yōu)秀的持久層解決方案!



天外飛仙 2006-04-20 15:15 發(fā)表評論
]]>
主站蜘蛛池模板: 亚洲一区二区三区无码影院| 成全视频免费高清| 久久久久久久亚洲精品| 亚洲av无码专区在线电影| 成人男女网18免费视频| 亚洲精品蜜夜内射| 国产片免费福利片永久| 男男gay做爽爽免费视频| 亚洲Aⅴ无码一区二区二三区软件 亚洲AⅤ视频一区二区三区 | 最新国产乱人伦偷精品免费网站| 国产亚洲精品高清在线| 日韩a级无码免费视频| 亚洲电影中文字幕| 91短视频免费在线观看| 中文字幕无码精品亚洲资源网久久| 永久黄网站色视频免费观看| 亚洲heyzo专区无码综合| 亚洲国产精品一区二区第一页免 | 日韩精品无码免费专区午夜| 亚洲精品天天影视综合网| 国产妇乱子伦视频免费| 亚洲国产精品网站在线播放 | 亚洲精品线在线观看| 皇色在线视频免费网站| 免费亚洲视频在线观看| 亚洲乱码国产一区三区| 一二三四影视在线看片免费| 国产精品久久久久久亚洲小说 | 野花高清在线观看免费3中文| 真人无码作爱免费视频| 日韩亚洲AV无码一区二区不卡| 国产片AV片永久免费观看| 色费女人18女人毛片免费视频| 国产精一品亚洲二区在线播放| 日本妇人成熟免费中文字幕 | 亚洲国产亚洲片在线观看播放| 日韩一品在线播放视频一品免费| 黄色视屏在线免费播放| 亚洲人成网站看在线播放| 国产黄色一级毛片亚洲黄片大全| 最近中文字幕大全中文字幕免费 |