SessionFactory配置
因?yàn)镠ibernate被設(shè)計(jì)為可以在許多不同環(huán)境下工作,所以它有很多配置參數(shù)。幸運(yùn)的是,大部分都已經(jīng)有默認(rèn)值了,Hibernate發(fā)行包中還附帶有示例的hibernate.properties文件,它演示了一些可變的參數(shù)。一般你只需要把這個(gè)文件放到你的classpath,配置一下即可。
net.sf.hibernate.cfg.Configuration的一個(gè)實(shí)例代表了應(yīng)用程序中所有的Java類(lèi)到SQL數(shù)據(jù)庫(kù)的映射的集合。Configuration用于構(gòu)造一個(gè)(不可變的)SessionFactory。這些映射是從一些XML映射文件中編譯得來(lái)的。
你可以得到一個(gè)Configuration的實(shí)例,直接實(shí)例化它即可。下面有一個(gè)例子,用來(lái)從兩個(gè)XML配置文件(位于classpath)中的映射中初始化: Configuration cfg = new Configuration()
.addFile("Item.hbm.xml")
.addFile("Bid.hbm.xml");
另外一個(gè)(某些時(shí)候更好的)方法是讓Hibernate自行用getResourceAsStream()來(lái)裝載映射文件。 Configuration cfg = new Configuration()
.addClass(org.hibernate.auction.Item.class)
.addClass(org.hibernate.auction.Bid.class);
Hibernate 就會(huì)在classpath中尋找叫做/org/hibernate/autcion/Item.hbm.xml、/org/hibernate/autcion/Bid.hbm.xml的映射文件。這種方法取消了所有對(duì)文件名的硬編碼。
Configuration也可以指定一些可選的配置項(xiàng): Properties props = new Properties();
...
Configuration cfg = new Configuration()
.addClass(org.hibernate.auction.Item.class)
.addClass(org.hibernate.auction.Bid.class)
.setProperties(props);
Configuration是僅在配置期使用的對(duì)象,從第一個(gè)SessionFactory開(kāi)始建立的時(shí)候,它就失效了。
當(dāng)所有的映射都被Configuration解析之后,應(yīng)用程序?yàn)榱说玫?TT class=literal>Session實(shí)例,必須先得到它的工廠。這個(gè)工廠應(yīng)該是被應(yīng)用程序的所有線程共享的: SessionFactory sessions = cfg.buildSessionFactory();
當(dāng)然,Hibernate并不禁止你的程序?qū)嵗鄠€(gè)SessionFactory。在你使用不止一個(gè)數(shù)據(jù)庫(kù)的時(shí)候,這就有用了。
SessionFactory可以使用一個(gè)用戶自行提供的JDBC連接來(lái)打開(kāi)一個(gè)Session。這種設(shè)計(jì)可以讓?xiě)?yīng)用程序來(lái)自己管理JDBC連接: java.sql.Connection conn = datasource.getConnection();
Session session = sessions.openSession(conn);
// do some data access work
應(yīng)用程序必須小心,不能在同一個(gè)連接上打開(kāi)兩個(gè)并行的session!
另一種方法就是,你可以讓SessionFactory替你打開(kāi)連接。SessionFactory必須事先知道JDBC連接的參數(shù),有幾種不同的方法設(shè)置參數(shù):
-
傳遞一個(gè)java.util.Properties到Configuration.setProperties()方法。
-
在classpath的根目錄中提供hibernate.properties文件。
-
通過(guò)java -Dproperty=value指定使用系統(tǒng)屬性。
-
在hibernate.cfg.xml文件中包含<property>元素。詳情見(jiàn)后。
如果你使用這種方法,打開(kāi)一個(gè)Session是非常簡(jiǎn)單的: Session session = sessions.openSession(); // open a new Session
// do some data access work, a JDBC connection will be used on demand
所有的Hibernate屬性名和約束都在net.sf.hibernate.cfg.Environment類(lèi)中定義。我們討論一下JDBC連接配置最重要的幾項(xiàng)設(shè)置:
假若你設(shè)置了如下的屬性,Hibernate會(huì)使用java.sql.DriverManager來(lái)得到連接,并建立連接池:
表 3.1. Hibernate JDBC屬性
屬性名 |
用途 |
hibernate.connection.driver_class |
jdbc驅(qū)動(dòng)類(lèi) |
hibernate.connection.url |
jdbc URL |
hibernate.connection.username |
數(shù)據(jù)庫(kù)用戶名 |
hibernate.connection.password |
數(shù)據(jù)庫(kù)用戶密碼 |
hibernate.connection.pool_size |
連接池容量最大數(shù) |
Hibernate的連接池算法是非常可配置的。它的用途是讓你上手,但是并非讓你在生產(chǎn)系統(tǒng)中使用的,甚至不是用來(lái)做性能測(cè)試的。如果為了得到最好的性能和可靠性需要使用第三方的池,請(qǐng)用你連接池特定的設(shè)置來(lái)取代hibernate.connection.pool_size屬性。
C3P0是隨Hibernate發(fā)行包一起發(fā)布的一個(gè)開(kāi)放源代碼JDBC連接池,你可以在lib 目錄中找到。假若你設(shè)置了hibernate.c3p0.* 屬性,Hibernate會(huì)使用內(nèi)置的C3P0ConnectionProvider作為連接池。 對(duì)Apache DBCP和Proxool的支持也是內(nèi)置的。你必須設(shè)置hibernate.dbcp.*屬性 (DBCP連接池屬性)來(lái)打開(kāi)DBCPConnectionProvider。如果打開(kāi)hibernate.dbcp.ps.* (DBCP 語(yǔ)句緩存屬性)可以使用Prepared statement緩存(高度推薦)。要知道它們的含義,請(qǐng)查閱Apache commons-pool的文檔。如果你想要用Proxool,你需要設(shè)置hibernate.proxool.*系列屬性。
下面是使用C3P0的一個(gè)例子: hibernate.connection.driver_class = org.postgresql.Driver
hibernate.connection.url = jdbc:postgresql://localhost/mydatabase
hibernate.connection.username = myuser
hibernate.connection.password = secret
hibernate.c3p0.min_size=5
hibernate.c3p0.max_size=20
hibernate.c3p0.timeout=1800
hibernate.c3p0.max_statements=50
hibernate.dialect = net.sf.hibernate.dialect.PostgreSQLDialect
在Application Server內(nèi)使用時(shí),Hibernate可以從JNDI中注冊(cè)的javax.sql.Datasource取得連接。需要設(shè)置如下屬性:
表 3.2. Hibernate 數(shù)據(jù)源(Datasource)屬性
屬性名 |
用途 |
hibernate.connection.datasource |
datasource JNDI 名字 |
hibernate.jndi.url |
JNDI 提供者的URL (可選) |
hibernate.jndi.class |
JNDI InitialContextFactory的類(lèi)名 (可選) |
hibernate.connection.username |
數(shù)據(jù)庫(kù)用戶名 (可選) |
hibernate.connection.password |
數(shù)據(jù)庫(kù)密碼 (可選) |
下面是一個(gè)使用應(yīng)用服務(wù)器提供的JNDI數(shù)據(jù)源的例子: hibernate.connection.datasource = java:/comp/env/jdbc/MyDB
hibernate.transaction.factory_class = /
net.sf.hibernate.transaction.JTATransactionFactory
hibernate.transaction.manager_lookup_class = /
net.sf.hibernate.transaction.JBossTransactionManagerLookup
hibernate.dialect = /
net.sf.hibernate.dialect.PostgreSQLDialect
從JNDI數(shù)據(jù)源獲得的JDBC連接自動(dòng)具有應(yīng)用服務(wù)器的容器管理事務(wù)的特性。
可以通過(guò)"hibernate.connnection"開(kāi)頭的屬性來(lái)設(shè)置特別的連接屬性。比如,你可以通過(guò)hibernate.connnection.charSet來(lái)指定charSet。
通過(guò)實(shí)現(xiàn)net.sf.hibernate.connection.ConnectionProvider接口,你可以定義如何獲得JDBC連接的策略。你可以通過(guò)設(shè)置hibernate.connection.provider_class來(lái)選擇一個(gè)自定義的實(shí)現(xiàn)。
下面是一些在運(yùn)行時(shí)可以改變Hibernate行為的其他配置。所有這些都是可選的,也有合理的默認(rèn)值。
系統(tǒng)級(jí)別的配置只能通過(guò)java -Dproperty=value或者在hibernate.properties文件中配置,而不能通過(guò)傳遞給Configuration的Properties實(shí)例來(lái)配置。
表 3.3. Hibernate配置屬性
屬性名 |
用途 |
hibernate.dialect |
Hibernate方言(Dialect)的類(lèi)名 - 可以讓Hibernate使用某些特定的數(shù)據(jù)庫(kù)平臺(tái)的特性
取值. full.classname.of.Dialect |
hibernate.default_schema |
在生成的SQL中,scheml/tablespace的全限定名
取值. SCHEMA_NAME |
hibernate.session_factory_name |
自動(dòng)把創(chuàng)建的SessionFactory以這個(gè)名字綁定到JNDI中去.
取值. jndi/composite/name |
hibernate.use_outer_join |
允許使用外連接抓取。已經(jīng)失效。請(qǐng)使用max_fetch_depth。
取值. true | false |
hibernate.max_fetch_depth |
對(duì)單根聯(lián)合(一對(duì)一,多對(duì)一),設(shè)置外連接抓取樹(shù)的最大深度。如果是0將關(guān)閉默認(rèn)的外連接抓取。
取值. 建議設(shè)置為0到3之間 |
hibernate.jdbc.fetch_size |
一個(gè)非零值,用來(lái)決定JDBC的獲取量大小。(會(huì)調(diào)用Statement.setFetchSize()). |
hibernate.jdbc.batch_size |
一個(gè)非零值,會(huì)開(kāi)啟Hibernate使用JDBC2的批量更新功能
取值. 建議值在 5 和 30之間。 |
hibernate.jdbc.use_scrollable_resultset |
允許Hibernate使用JDBC2提供的可滾動(dòng)結(jié)果集。只有在使用用戶自行提供的JDBC連接時(shí),這個(gè)參數(shù)才是必需的。否則Hibernate會(huì)使用連接的元數(shù)據(jù)(metadata)。
取值. true | false |
hibernate.jdbc.use_streams_for_binary |
在從JDBC讀寫(xiě)binary(二進(jìn)制)或者serializable(可序列化)類(lèi)型時(shí),是否使用stream(流). (這是一個(gè)系統(tǒng)級(jí)別的屬性。)
取值. true | false |
hibernate.jdbc.use_get_generated_keys |
允許使用JDBC3的PreparedStatement.getGeneratedKeys()在插入后獲取數(shù)據(jù)庫(kù)自身生成的key。需要JDBC3以上的驅(qū)動(dòng)和JRE1.4以上,如果你的驅(qū)動(dòng)和Hibernate關(guān)鍵字生成器一起使用有問(wèn)題,請(qǐng)?jiān)O(shè)為false。默認(rèn)情況下,會(huì)用connection元數(shù)據(jù)根據(jù)驅(qū)動(dòng)是否支持自動(dòng)判斷。
取值. true|false |
hibernate.cglib.use_reflection_optimizer |
是否使用CGLIB來(lái)代替運(yùn)行時(shí)反射操作。(系統(tǒng)級(jí)別屬性,默認(rèn)為在可能時(shí)都使用CGLIB).在調(diào)試的時(shí)候有時(shí)候使用反射會(huì)有用。
取值. true | false |
hibernate.jndi.<propertyName> |
把propertyName這個(gè)屬性傳遞到JNDI InitialContextFactory去 (可選) |
hibernate.connection.isolation |
事務(wù)隔離級(jí)別 (可選).請(qǐng)檢查java.sql.Connection來(lái)得到取值的具體意義。注意大多數(shù)數(shù)據(jù)庫(kù)不會(huì)支持所有的隔離級(jí)別。
取值. 1, 2, 4, 8 |
hibernate.connection.<propertyName> |
把 propertyName這個(gè)JDBC 屬性傳遞到DriverManager.getConnection()去 |
hibernate.connection.provider_class |
指定一個(gè)自定義的ConnectionProvider類(lèi)名
取值. classname.of.ConnectionProvider |
hibernate.cache.provider_class |
指定一個(gè)自定義的CacheProvider緩存提供者的類(lèi)名
取值. classname.of.CacheProvider |
hibernate.cache.use_minimal_puts |
優(yōu)化第二級(jí)緩存操作,減少寫(xiě)操作,代價(jià)是讀操作更頻繁(對(duì)于集群緩存很有用)
取值. true|false |
hibernate.cache.use_query_cache |
打開(kāi)查詢緩存,每個(gè)查詢?nèi)匀槐仨氈该鱟acheable。
取值. true|false |
hibernate.cache.region_prefix |
用于第二級(jí)緩存區(qū)域名字的前綴
取值. prefix |
hibernate.transaction.factory_class |
指定一個(gè)自定義的TransactionFactory類(lèi)名,Hibernate Transaction API將會(huì)使用(默認(rèn)是JDBCTransactionFactory)。
取值. classname.of.TransactionFactory |
jta.UserTransaction |
JTATransactionFactory 用來(lái)從應(yīng)用服務(wù)器獲取JTA UserTransaction的JNDI名
取值. jndi/composite/name |
hibernate.transaction.manager_lookup_class |
TransactionManagerLookup的類(lèi)名 - 當(dāng)在JTA環(huán)境中,JVM級(jí)別的緩存被打開(kāi)的時(shí)候使用.
取值. classname.of.TransactionManagerLookup |
hibernate.query.substitutions |
把Hibernate查詢中的一些短語(yǔ)替換為SQL短語(yǔ)(比如說(shuō)短語(yǔ)可能是函數(shù)或者字符)。
取值. hqlLiteral=SQL_LITERAL, hqlFunction=SQLFUNC |
hibernate.show_sql |
把所有的SQL語(yǔ)句都輸出到控制臺(tái)
取值. true | false |
hibernate.hbm2ddl.auto |
在SessionFactory創(chuàng)建后,自動(dòng)輸出schema創(chuàng)建DDL語(yǔ)句到數(shù)據(jù)庫(kù).和create-drop同時(shí)使用的話,數(shù)據(jù)庫(kù)schema會(huì)在SessionFactory顯式關(guān)閉后被drop掉。
取值. update | create | create-drop |
你總是可以為你的數(shù)據(jù)庫(kù)設(shè)置一個(gè)hibernate.dialect方言,它是net.sf.hibernate.dialect.Dialect 的一個(gè)子類(lèi)。如果你不需要使用基于native或者sequence的主鍵自動(dòng)生成算法,或者悲觀鎖定(使用Session.lock() 或 Query.setLockMode())的話,方言就可以不必指定。然而,假若你指定了一個(gè)方言,Hibernate會(huì)為上面列出的一些屬性使用特殊默認(rèn)值,省得你手工指定它們。
表 3.4. Hibernate SQL 方言 (hibernate.dialect)
RDBMS |
方言 |
DB2 |
net.sf.hibernate.dialect.DB2Dialect |
DB2 AS/400 |
net.sf.hibernate.dialect.DB2400Dialect |
DB2 OS390 |
net.sf.hibernate.dialect.DB2390Dialect |
PostgreSQL |
net.sf.hibernate.dialect.PostgreSQLDialect |
MySQL |
net.sf.hibernate.dialect.MySQLDialect |
Oracle (any version) |
net.sf.hibernate.dialect.OracleDialect |
Oracle 9 |
net.sf.hibernate.dialect.Oracle9Dialect |
Sybase |
net.sf.hibernate.dialect.SybaseDialect |
Sybase Anywhere |
net.sf.hibernate.dialect.SybaseAnywhereDialect |
Microsoft SQL Server |
net.sf.hibernate.dialect.SQLServerDialect |
SAP DB |
net.sf.hibernate.dialect.SAPDBDialect |
Informix |
net.sf.hibernate.dialect.InformixDialect |
HypersonicSQL |
net.sf.hibernate.dialect.HSQLDialect |
Ingres |
net.sf.hibernate.dialect.IngresDialect |
Progress |
net.sf.hibernate.dialect.ProgressDialect |
Mckoi SQL |
net.sf.hibernate.dialect.MckoiDialect |
Interbase |
net.sf.hibernate.dialect.InterbaseDialect |
Pointbase |
net.sf.hibernate.dialect.PointbaseDialect |
FrontBase |
net.sf.hibernate.dialect.FrontbaseDialect |
Firebird |
net.sf.hibernate.dialect.FirebirdDialect |
5.2. 外連接抓?。∣uter Join Fetching )
如果你的數(shù)據(jù)庫(kù)支持ANSI或者Oracle風(fēng)格的外連接,外連接抓取可能提高性能,因?yàn)榭梢韵拗坪蛿?shù)據(jù)庫(kù)交互的數(shù)量(代價(jià)是數(shù)據(jù)庫(kù)自身進(jìn)行了更多的工作)。外連接抓取允許你在一個(gè)select語(yǔ)句中就可以得到一個(gè)由多對(duì)一或者一對(duì)一連接構(gòu)成的對(duì)象圖。
默認(rèn)情況下,抓取在葉對(duì)象,擁有代理的對(duì)象或者產(chǎn)生對(duì)自身的引用時(shí)終止。
對(duì)一個(gè)特定關(guān)聯(lián)來(lái)說(shuō),通過(guò)在XML映射文件中設(shè)置outer-join屬性可以控制是否開(kāi)啟抓取功能。
也可以設(shè)置hibernate.max_fetch_depth為0來(lái)全局關(guān)閉此功能。如果設(shè)置為1或更高的數(shù)值,對(duì)所有的一對(duì)一和多對(duì)一關(guān)聯(lián)會(huì)打開(kāi)外連接抓取。默認(rèn)情況下,它被設(shè)置為auto,即自動(dòng)外連接。但是,一對(duì)多關(guān)聯(lián)和集合永遠(yuǎn)不會(huì)使用外連接抓取,除非對(duì)每個(gè)特定的關(guān)聯(lián)進(jìn)行明確聲明。這一行為可以在運(yùn)行時(shí)通過(guò)Hibernate 查詢重載。
Oracle限制通過(guò)它的JDBC驅(qū)動(dòng)傳遞的byte數(shù)組的大小。如果你希望使用很大數(shù)量的binary或者serializable 類(lèi)型的話,你需要打開(kāi)hibernate.jdbc.use_streams_for_binary。這只能通過(guò)JVM級(jí)別設(shè)定
通過(guò)實(shí)現(xiàn)net.sf.hibernate.cache.CacheProvider接口,你可以整合一個(gè)JVM級(jí)別(或者集群的)第二級(jí)緩存進(jìn)來(lái)。你可以通過(guò)hibernate.cache.provider_class選擇某個(gè)自定義的實(shí)現(xiàn)。
如果你希望使用Hibernate的Transaction API,你必須通過(guò)hibernate.transaction.factory_class屬性指定一個(gè)Transaction實(shí)例的工廠類(lèi)。 Transaction API隱藏了底層的事務(wù)機(jī)制,允許Hibernate代碼在受管制和非受管制的環(huán)境下都可以運(yùn)行。
內(nèi)置的兩個(gè)標(biāo)準(zhǔn)選擇是:
- net.sf.hibernate.transaction.JDBCTransactionFactory
-
使用數(shù)據(jù)庫(kù)(JDBC)事務(wù)(默認(rèn))
- net.sf.hibernate.transaction.JTATransactionFactory
-
使用JTA(假若已經(jīng)存在一個(gè)事務(wù),Session會(huì)在這個(gè)上下文中工作,否則會(huì)啟動(dòng)一個(gè)新的事務(wù)。)
你也可以自行定義你的事務(wù)策略(比如說(shuō),一個(gè)CORBA事務(wù)服務(wù))。
如果你希望在JTA環(huán)境中為可變數(shù)據(jù)使用JVM級(jí)別的緩存,你必須指定一個(gè)獲取JTA TransactionManager的策略,但這對(duì)J2EE容易來(lái)說(shuō)不是標(biāo)準(zhǔn)化的:
表 3.5. JTA TransactionManagers
事務(wù)工廠類(lèi) |
Application Server |
net.sf.hibernate.transaction.JBossTransactionManagerLookup |
JBoss |
net.sf.hibernate.transaction.WeblogicTransactionManagerLookup |
Weblogic |
net.sf.hibernate.transaction.WebSphereTransactionManagerLookup |
WebSphere |
net.sf.hibernate.transaction.OrionTransactionManagerLookup |
Orion |
net.sf.hibernate.transaction.ResinTransactionManagerLookup |
Resin |
net.sf.hibernate.transaction.JOTMTransactionManagerLookup |
JOTM |
net.sf.hibernate.transaction.JOnASTransactionManagerLookup |
JOnAS |
net.sf.hibernate.transaction.JRun4TransactionManagerLookup |
JRun4 |
net.sf.hibernate.transaction.BESTransactionManagerLookup |
Borland ES |
5.6. 綁定SessionFactory到JNDI
綁定到JNDI的Hibernate SessionFactory可以簡(jiǎn)化查找工廠和創(chuàng)建新Session的過(guò)程。
假若你希望把SessionFactory綁定到一個(gè)JNDI命名空間,用hibernate.session_factory_name這個(gè)屬性指定一個(gè)名字(比如,java:comp/env/hibernate/SessionFactory)。如果這個(gè)屬性省略了,SessionFactory不會(huì)被綁定到JNDI。(在一個(gè)只讀的JNDI默認(rèn)值實(shí)現(xiàn)的環(huán)境中,這特別有用。比如,Tomcat。)
當(dāng)把SessionFactory 綁定到JNDI,Hibernate會(huì)使用hibernate.jndi.url,hibernate.jndi.class的值來(lái)獲得一個(gè)初始化上下文的實(shí)例。如果他們沒(méi)有指定,就會(huì)使用默認(rèn)的InitialContext。
如果你選擇使用JNDI,EJB或者其他工具類(lèi)就可以通過(guò)JNDI查詢得到SessionFactory。
你可以使用hibernate.query.substitutions定義新的Hibernate查詢短語(yǔ)。比如說(shuō): hibernate.query.substitutions true=1, false=0
會(huì)在生成的SQL中把短語(yǔ)true和 false替換成整數(shù)值。 hibernate.query.substitutions toLowercase=LOWER
這可以讓你重新命名SQL的LOWER函數(shù)。
通過(guò)Apache commons-logging,Hibernate記錄很多事件。
commons-logging服務(wù)會(huì)直接輸出到Apache log4j(如果你把log4j.jar放在你的classpath里),或者JDK1.4 logging(如果你運(yùn)行JDK 1.4或以上版本)。你可以從http://jakarta.下載log4j。要使用log4j,你需要在你的classpath中放置一個(gè)log4j.properties文件。Hibernate發(fā)行包中包含一個(gè)示例的properties配置文件。
我們強(qiáng)烈建議你熟悉Hibernate的log信息。Hibernate的很多工作都會(huì)盡量詳細(xì)的留下log,也沒(méi)有讓它變的難以閱讀。這是用來(lái)解決問(wèn)題的最基本的設(shè)施。當(dāng)然也別忘了可以如前所述打開(kāi)SQL 記錄(hibernate.show_sql),在你要解決性能問(wèn)題時(shí),這是你第一步就需要做的。
7. 實(shí)現(xiàn)NamingStrategy(命名策略)
net.sf.hibernate.cfg.NamingStrategy接口允許你對(duì)數(shù)據(jù)庫(kù)對(duì)象和schema元素指定“命名標(biāo)準(zhǔn)”。
你可以定義從Java標(biāo)識(shí)符自動(dòng)生成數(shù)據(jù)庫(kù)標(biāo)識(shí)符的規(guī)則,或者是映射文件中給出的“邏輯”字段名和表名處理為“物理”表名和字段名的規(guī)則。這個(gè)功能可以讓映射文件變得簡(jiǎn)潔,消除無(wú)用的噪音(比如TBL_前綴等)。Hibernate使用的默認(rèn)策略是幾乎什么都不做。
你可以在增加映射(add mappings)之前調(diào)用Configuration.setNamingStrategy()來(lái)指定不同的策略。 SessionFactory sf = new Configuration()
.setNamingStrategy(ImprovedNamingStrategy.INSTANCE)
.addFile("Item.hbm.xml")
.addFile("Bid.hbm.xml")
.buildSessionFactory();
net.sf.hibernate.cfg.ImprovedNamingStrategy 是一個(gè)內(nèi)置的策略,對(duì)某些程序,你可以把它作為改造的起點(diǎn)。
另一種配置屬性的方法是把所有的配置都放在一個(gè)名為hibernate.cfg.xml的文件中。這個(gè)文件可以被用于替代hibernate.properties文件,如果二者都出現(xiàn),它會(huì)覆蓋properties文件。
XML配置文件默認(rèn)會(huì)期望在CLASSPATH的根目錄中找到。下面是一個(gè)例子。 <?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 2.0//EN"
"http://hibernate./hibernate-configuration-2.0.dtd">
<hibernate-configuration>
<!-- a SessionFactory instance listed as /jndi/name -->
<session-factory
name="java:comp/env/hibernate/SessionFactory">
<!-- properties -->
<property name="connection.datasource">my/first/datasource</property>
<property name="dialect">net.sf.hibernate.dialect.MySQLDialect</property>
<property name="show_sql">false</property>
<property name="use_outer_join">true</property>
<property name="transaction.factory_class">
net.sf.hibernate.transaction.JTATransactionFactory
</property>
<property name="jta.UserTransaction">java:comp/UserTransaction</property>
<!-- mapping files -->
<mapping resource="org/hibernate/auction/Item.hbm.xml"/>
<mapping resource="org/hibernate/auction/Bid.hbm.xml"/>
</session-factory>
</hibernate-configuration>
配置Hibernate只需如此簡(jiǎn)單: SessionFactory sf = new Configuration().configure().buildSessionFactory();
你可以使用另外一個(gè)名字的XML配置文件: SessionFactory sf = new Configuration()
.configure("catdb.cfg.xml")
.buildSessionFactory();
|