Hibernate第一天
1.下載Hibernate
Hibernate Home Page總要知道:http://www.hibernate.org/
改網站介紹了Hibernate的主要組件:
Hibernate Core:Hibernate的核心部分,主要用於Java開發,本地API以及XML映射元數據
Hibernate Annotations:一些Map類,用於JDK 5.0+的annotations
Hibernate EntityManager:標準的Java持久化API,用於SE和EE
Hibernate Shards:水平數據分區框架
Hibernate Validator:數據集成annotations和驗證API
Hibernate Search:Hibernate與Lucence集成,用於索引和檢索數據
ibernate Tools:用於Eclipse和Ant開發
NHibernate:用於.Net服務的Hibernate
JBoss Seam:用於JSF、Ajax、EJB 3.0/Java EE 5.0用用程序的框架
這些功能中,Hibernate Core自然是核心和基礎了,所以還是從Hibernate Core開始學習。
下載到Hibernate Core之後,將其解壓縮到本地目錄H_Home。例如D:/common/hibernate-distribution-3.3.0.GA。
在發佈包中,包含了Hibernate的五種語言的文檔。
Hibernate依賴的類庫,筆者使用的Hibernate的版本爲3.3.0,在lib文件夾中,Hibernate已經將依賴的類庫進行了組織,其中required目錄下的類庫爲必須使用的類庫。
在project目錄中包含了Hibernate的Maven工程。
2.既然已經準備好了Hibernate,那麼就根據Hibernate的教程進行學習吧。
首先開始第一個樣例程序的學習。
學習點一 將HSQLDB轉換爲MySQL
(HSQLDB是一個輕量級的100% Java的SQL數據庫引擎,參考http://hsqldb.org/)
之所以將HSQLDB切換爲MySQL只是爲了熟悉進行數據庫切換的辦法,畢竟產品開發時,數據庫一般不會使用HSQLDB。
>下載並安裝MySQL5(注意將charset設置爲UTF-8)
>下載MySQL Java Connector
>修改樣例程序的Hibernate Configuration如下:
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/hibernate</property>
<property name="connection.username">root</property>
<property name="connection.password">password</property>
<!-- JDBC connection pool (use the built-in) -->
<property name="connection.pool_size">15</property>
<!-- SQL dialect -->
<property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
注意,在上面的配置中,基本上前面四行是必須修改的,但是筆者在第一次配置時,沒有將dialect進行對應的修改,導致運行時發生了錯誤。
因爲不同的dialect會生成針對不同數據庫的SQL語句。
例如如果使用教程中的org.hibernate.dialect.HSQLDialect,那麼在運行時就會提示控制檯錯誤:
[java] 01:19:38,125 DEBUG SchemaExport:377 - drop table EVENTS if exists
[java] 01:19:38,125 DEBUG SchemaExport:362 - Unsuccessful: drop table EVENTS if exists
[java] 01:19:38,125 DEBUG SchemaExport:363 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'if exists' at line 1
[java] 01:19:38,125 DEBUG SchemaExport:377 - create table EVENTS (EVENT_ID bigint generated by default as identity (start with 1), EVENT_DATE timestamp, title varchar(255), primary key (EVENT_ID))
[java] 01:19:38,140 ERROR SchemaExport:348 - Unsuccessful: create table EVENTS (EVENT_ID bigint generated by default as identity (start with 1), EVENT_DATE timestamp, title varchar(255), primary key (EVENT_ID))
[java] 01:19:38,140 ERROR SchemaExport:349 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'generated by default as identity (start with 1), EVENT_DATE timestamp, title var' at line 1
當切換爲正確的org.hibernate.dialect.MySQL5Dialect時,控制檯日誌如下:
[java] 01:21:45,187 DEBUG SchemaExport:377 - drop table if exists EVENTS
[java] 01:21:45,203 DEBUG SchemaExport:377 - create table EVENTS (EVENT_ID bigint not null auto_increment, EVENT_DATE datetime, title varchar(255), primary key (EVENT_ID))
[java] 01:21:45,203 INFO SchemaExport:268 - schema export complete
[java] Hibernate: insert into EVENTS (EVENT_DATE, title) values (?, ?)
所以在切換數據庫類型時,一定要將dialect也進行切換。(詳細的配置信息參考H_HOME/project/etc/hibernate.properties)
3.配置日誌
現在的Hibernate使用了SLF4J作爲日誌機制。在運行時,需要進行動態的配置日誌。
現在使用比較多的是Log4j,此時需要進入H_HOME,將H_HOME/project/etc下面的log4j.properties拷貝到Hibernate工程的src目錄下,在需要的情況下,可以對log4j.properties進行自定義的配置。
但是僅僅拷貝改爲見還是不可以的,必須將以下兩個類庫拷貝到類路徑中:
否則就會在控制檯打印如下錯誤:
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".(缺少slf4j-log4j12-1.5.2.jar)
Initial SessionFactory creation failed.java.lang.NoClassDefFoundError: org/apache/log4j/Level(缺少log4j-1.2.12.jar)
4.關於drop-recreate
在hibernate.cfg.xml配置中,教程中的配置文件包含如下的內容:
<!-- Drop and re-create the database schema on startup -->
<property name="hbm2ddl.auto">create</property>
改配置會在每次創建數據庫表之前先將表drop。這樣如果在運行EventManager時,如果先執行一次store,再執行一次list,就看不到任何記錄。
所以在運行時,一旦數據庫表創建成功,那麼就需要關閉該配置。