天天看點

轉載 http://www.diybl.com/course/3_program/java/javajs/2008819/136428.html 了Hibernate的主要元件

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,就看不到任何記錄。

是以在運作時,一旦資料庫表建立成功,那麼就需要關閉該配置。