Hibernate
英文的直意是冬眠的意思。
Hibernate
是一個面向
Java
環境的對象
/
關系數據映射工具,注意,這是一種技術工具。
ORM
(
object relational mapping
)
這個術語表示一種技術,用來把對象模型表示的對象映射到基于
SQL
的關系模型數據結構中去。
以上的這些概念性的東西,然我感覺和
.NET Framework 2.0
中的強類型數據集的作用差不多,但聽研究過的人說,要比
Microsoft
的那個好得多,
Microsoft
的強類型數據集我用過,感覺爽,既然有說
Hibernate
更好,那已經更是過癮,我心里癢癢的呀。繼續。。。
書中有這樣一句“對于以數據為中心的程序來說,他們往往只在數據庫中使用存儲過程來實現商業邏輯,
Hibernate
可能不是最好的解決方案。”這個是一定啦,
Hibernate
是橋梁,又不是萬金油,當然是在數據庫中直接用存儲過程處理商業邏輯是最好的啦。我做過,直接在存儲過程中搞定一切東西,傳一個參數過去,然后所有的運算都在
SQL Server 2000
的存儲過程中完成,那叫一個爽,比把數據讀到程序里,然后用
Java
處理,再把數據傳回去要快得多,但是在
SQL Server 2000
里直接用存儲過程來完成這樣的工作,難度還是不小的,調試就是最大的難點,反正我是沒整明白有啥辦法可以調試的,我就用最原始、最保靠,據說是也是有效的調試方法
print
來完成。哈哈。夠暈的吧!繼續看。。。
現在看到了一個“持久化實體類”這個類是符合
JavaBean
的編寫要求。并且要給它一個唯一的標識符,這是為了我們使用
Hibernate
提供的所有特性。大多數程序,特別是
web
程序,都需要通過標識符來區分對象。但,通常我們不會直接操作對象的標識符,所以他的
setter
方法的訪問級別是
private
。
Hibernate
需要知道怎樣去加載(
load
)和存儲(
store
)持久化類的對象,映射文件,它就是告訴
Hibernate
,應該訪問數據庫里面的哪個表,已經應該使用表里面哪些字段。
Hibernate
不會從
web
加載
DTD
文件,但它會首先在應用程序的
classpath
中查找。
DTD
文件包含在
hibernate3.jar
里,同時在
Hibernate
發布包的
src/
目錄下。
映射文件的長相:
Event.hbm.xml
<hibernate-mapping>
???? <classname="events.Event" table="Events">
??????????? <idname="id" column="eventID">
?????????????????? <generatorclass="native"/>
??????????? </id>
??????????? <propertyname="date" type="timestamp" column="eventDate"/>
??????????? <propertyname="title" column="eventTitle"/>
???? </class>
</hibernate-mapping>
?
說明:
class
表示持久化類;
id
表示唯一標識;
property
表示類的屬性字段;
name
是持久化類名;
table
是數據表名;
column
是數據字段名;
generator
是唯一標識的生成方式;
type
是映射的數據類型。
?
Hibernate
配置文件的長相:
hibernate.cfg.xml
<!-- by MyEclipse Hibernate tool integration. -->
<hibernate-configuration>
??? <session-factory>
??????? <!-- properties -->
??????? <propertyname="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
??????? <propertyname="connection.url">jdbc:oracle:thin:@localhost:1521:test</property>
??????? <propertyname="connection.username">system</property>
???????????
?<propertyname="connection.password">manager</property>
????????????????????????????????????????????????????????????????????
??????? <propertyname="dialect">net.sf.hibernate.dialect.OracleDialect</property>
???????
????????????????????????????????????????????
?????????????????
??????? <!-- mapping files -->
??????? <mappingresource="events/Event.hbm.xml"/>
??
?</session-factory>
</hibernate-configuration>
?
說明:
Session-factory
:特定數據庫全局工廠
connection.driver_class
:驅動類
connection.url
:連接路徑
connection.username
:用戶名
connection.password
:用戶密碼
mapping resource
:持久化類加入映射文件
?
用
ant
創建
build.xml
我理解他就是管理文件位置的,就是拷貝,為編譯運行做準備。
?
SessionFactory
是一個線程安全的全局對象,只需要被實例化一次,一個
Session
代表一個單線程的單元操作。
?
這時又來了一個輔助類
HibernateUtil
,負責啟動
Hibernate
和更好的操作
SessionFactory
。
最后配置一個日志系統,
Log4j
或
JDK 1.4
都可以選擇。
?
看到了一種編程模型:線程綁定(
thread-bound
)
Session
在第一次被使用,或第一次調用
getCurrentSession()
的時候,其生命周期就開始了,然后它被
Hibernate
綁定到當前線程。當事務運行結束的時候,不管是提交、回滾,
Hibernate
都會把
Session
從當前線程剝離,并且關閉它。