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,就看不到任何記錄。
是以在運作時,一旦資料庫表建立成功,那麼就需要關閉該配置。