Hibernate的描述文件可以是一個properties屬性文件,也可以是一個xml文件。下面講一下Hibernate.cfg.xml的配置。配置格式如下:
1. 配置數據源
1. 配置數據源
在Hibernate.cfg.xml中既可以配置JDBC,也可以配置JNDI。在本小節中講述數據源如何配置。
hibernate.cfg.xml
<?xml version=”1.0″ encoding=”UTF-8″?> <!DOCTYPE hibernate-configuration PUBLIC “-//Hibernate/Hibernate Configuration DTD 3.0//EN” “http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd“> <hibernate-configuration> <session-factory> <!– 各屬性的配置–> <!—為true表示將Hibernate發送給數據庫的sql顯示出來 –> <property name=”show_sql”>true</property> <!– SQL方言,這邊設定的是MySQL –> <property name=”dialect”>net.sf.hibernate.dialect.MySQLDialect</property> <!– 一次讀的數據庫記錄數 –> <property name=”jdbc.fetch_size”>50</property> <!– 設定對數據庫進行批量刪除 –> <property name=”jdbc.batch_size”>30</property> <!—下面為JNDI的配置 –> <!– 數據源的名稱 –> <property name=”connection.datasource”>java:comp/env/jdbc/datasourcename</property> <!– Hibernate的連接加載類 –> <property name=”connection.provider_class”>org.hibernate.connection.DatasourceConnectionProvider </property> <property name=”dialect”>net.sf.hibernate.dialect.SQLServerDialect</property> <!—映射文件 –> <mapping resource=”com/amigo/pojo/User.hbm.xml”/> <mapping resource=”com/amigo/pojo/Org.hbm.xml”/> </session-factory> </hibernate-configuration>
2. c3p0連接池
c3p0連接池是Hibernate推薦使用的連接池,若需要使用該連接池時,需要將c3p0的jar包加入到classpath中。c3p0連接池的配置示例如下:
c3p0連接池是Hibernate推薦使用的連接池,若需要使用該連接池時,需要將c3p0的jar包加入到classpath中。c3p0連接池的配置示例如下:
hibernate.cfg.xml
<?xml version=”1.0″ encoding=”UTF-8″?> <!DOCTYPE hibernate-configuration PUBLIC “-//Hibernate/Hibernate Configuration DTD 3.0//EN” “http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd“> <hibernate-configuration> <session-factory> <!– 顯示實際操作數據庫時的SQL –> <property name=”show_sql”>true</property> <!– SQL方言,這邊設定的是MySQL –> <property name=”dialect”>net.sf.hibernate.dialect.MySQLDialect</property> <!–驅動程序,在后續的章節中將講述mysql、sqlserver和Oracle數據庫的配置 –> <property name=”connection.driver_class”>……</property> <!– JDBC URL –> <property name=”connection.url”>……</property> <!– 數據庫用戶名 –> <property name=”connection.username”>user</property> <!– 數據庫密碼 –> <property name=”connection.password”>pass</property> <property name=”c3p0.min_size”>5</property> <property name=”c3p0.max_size”>20</property> <property name=”c3p0.timeout”>1800</property> <property name=”c3p0.max_statements”>50</property> <!– 對象與數據庫表格映像文件 –> <mapping resource=”com/amigo/pojo/User.hbm.xml”/> <mapping resource=”com/amigo/pojo/Org.hbm.xml”/> </session-factory> </hibernate-configuration>
在上述配置中,Hibernate根據配置文件生成連接,再交給c3p0管理。
3. proxool連接池
proxool跟c3p0以及dbcp不一樣,它是自己生成連接的,因此連接信息放在proxool配置文件中。使用它時,需要將proxool-0.8.3.jar加入到classespath中。
(關於Hibernate中配置Proxool在proxool的百度百科有詳細的介紹:http://baike.baidu.com/view/2098784.htm)
配置舉例如下:
proxool跟c3p0以及dbcp不一樣,它是自己生成連接的,因此連接信息放在proxool配置文件中。使用它時,需要將proxool-0.8.3.jar加入到classespath中。
(關於Hibernate中配置Proxool在proxool的百度百科有詳細的介紹:http://baike.baidu.com/view/2098784.htm)
配置舉例如下:
hibernate.cfg.xml
<?xml version=”1.0″ encoding=”UTF-8″?> <!DOCTYPE hibernate-configuration PUBLIC “-//Hibernate/Hibernate Configuration DTD 3.0//EN” “http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd“> <hibernate-configuration> <session-factory> <!– 顯示實際操作數據庫時的SQL –> <property name=”show_sql”>true</property> <!– SQL方言,這邊設定的是MySQL –> <property name=”dialect”>net.sf.hibernate.dialect.MySQLDialect</property> <!—proxool的配置 –> <property name=”proxool.pool_alias”>pool1</property> <property name=”proxool.xml”>ProxoolConf.xml</property> <property name=”connection.provider_class”>net.sf.hibernate.connection.ProxoolConnectionProvider</property> <!– 對象與數據庫表格映像文件 –> <mapping resource=”com/amigo/pojo/User.hbm.xml”/> <mapping resource=”com/amigo/pojo/Org.hbm.xml”/> </session-factory> </hibernate-configuration> 在hibernate.cfg.xml的同目錄下編寫proxool的配置文件:ProxoolConf.xml,該文件的配置實例如下: ProxoolConf.xml <?xml version=”1.0″ encoding=”utf-8″?> <!– the proxool configuration can be embedded within your own application’s. Anything outside the “proxool” tag is ignored. –> <something-else-entirely> <proxool> <alias>pool1</alias> <!–proxool只能管理由自己產生的連接–> <!– 驅動的url–> <!– jdbc:mysql://localhost:3306/dbname?useUnicode=true&characterEncoding=GBK–> <driver-url>… </driver-url> <!– 驅動類,eg. com.mysql.jdbc.Driver–> <driver-class>… </driver-class> <driver-properties> <!– 數據庫用戶名,eg. value為root–> <property name=”user” value=”…”/> <!– 數據庫密碼,eg. value為root–> <property name=”password” value=”….”/> </driver-properties> <!– proxool自動偵察各個連接狀態的時間間隔(毫秒),偵察到空閑的連接就馬上回收,超時的銷毀–> <house-keeping-sleep-time>90000</house-keeping-sleep-time> <!– 指因未有空閑連接可以分配而在隊列中等候的最大請求數,超過這個請求數的用戶連接就不會被接受–> <maximum-new-connections>20</maximum-new-connections> <!– 最少保持的空閑連接數–> <prototype-count>5</prototype-count> <!– 允許最大連接數,超過了這個連接,再有請求時,就排在隊列中等候,最大的等待請求數由maximum-new-connections決定–> <maximum-connection-count>100</maximum-connection-count> <!– 最小連接數–> <minimum-connection-count>10</minimum-connection-count> </proxool> </something-else-entirely>
4. dbcp連接池
在hibernate3.0中,已經不再支持dbcp了,hibernate的作者在hibernate.org中,明確指出在實踐中發現dbcp有 BUG,在某些種情會產生很多空連接不能釋放,所以拋棄了對dbcp的支持。若需要使用dbcp,開發人員還需要將commons-pool- 1.2.jar 和commons-dbcp-1.2.1.jar兩個jar包加入到classpath中。dbcp與c3p0一樣,都是由hibernate建立連接 的。
在hibernate3.0中,已經不再支持dbcp了,hibernate的作者在hibernate.org中,明確指出在實踐中發現dbcp有 BUG,在某些種情會產生很多空連接不能釋放,所以拋棄了對dbcp的支持。若需要使用dbcp,開發人員還需要將commons-pool- 1.2.jar 和commons-dbcp-1.2.1.jar兩個jar包加入到classpath中。dbcp與c3p0一樣,都是由hibernate建立連接 的。
在hibernate2.0中的配置建立如下:
hibernate.cfg.xml
<?xml version=”1.0″ encoding=”UTF-8″?> <!DOCTYPE hibernate-configuration PUBLIC “-//Hibernate/Hibernate Configuration DTD 2.0//EN” “http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd“> <hibernate-configuration> <session-factory> <!– 顯示實際操作數據庫時的SQL –> <property name=”show_sql”>true</property> <!– SQL方言,這邊設定的是MySQL –> <property name=”dialect”>net.sf.hibernate.dialect.MySQLDialect</property> <!–驅動程序,在后續的章節中將講述mysql、sqlserver和Oracle數據庫的配置 –> <property name=”connection.driver_class”>……</property> <!– JDBC URL –> <property name=”connection.url”>……</property> <!– 數據庫用戶名,eg. root –> <property name=”connection.username”>…</property> <!– 數據庫密碼, eg. root–> <property name=”connection.password”>…</property> <property name=”dbcp.maxActive”>100</property> <property name=”dbcp.whenExhaustedAction”>1</property> <property name=”dbcp.maxWait”>60000</property> <property name=”dbcp.maxIdle”>10</property> <property name=”dbcp.ps.maxActive”>100</property> <property name=”dbcp.ps.whenExhaustedAction”>1</property> <property name=”dbcp.ps.maxWait”>60000</property> <property name=”dbcp.ps.maxIdle”>10</property> <!– 對象與數據庫表格映像文件 –> <mapping resource=”com/amigo/pojo/User.hbm.xml”/> <mapping resource=”com/amigo/pojo/Org.hbm.xml”/> </session-factory> </hibernate-configuration>
5. MySql連接配置
在hibernate中,可以配置很多種數據庫,例如MySql、Sql Server和Oracle,MySql的配置舉例如下:
在hibernate中,可以配置很多種數據庫,例如MySql、Sql Server和Oracle,MySql的配置舉例如下:
hibernate.cfg.xml
<?xml version=”1.0″ encoding=”UTF-8″?> <!DOCTYPE hibernate-configuration PUBLIC “-//Hibernate/Hibernate Configuration DTD 3.0//EN” “http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd“> <hibernate-configuration> <session-factory> <!– 各屬性的配置–> <!—為true表示將Hibernate發送給數據庫的sql顯示出來 –> <property name=”show_sql”>true</property> <!– SQL方言,這邊設定的是MySQL –> <property name=”dialect”>net.sf.hibernate.dialect.MySQLDialect</property> <!– 一次讀的數據庫記錄數 –> <property name=”jdbc.fetch_size”>50</property> <!– 設定對數據庫進行批量刪除 –> <property name=”jdbc.batch_size”>30</property> <!–驅動程序–> <property name=”connection.driver_class”>com.mysql.jdbc.Driver</property> <!– JDBC URL –> <property name=”connection.url”>jdbc:mysql://localhost/dbname?characterEncoding=gb2312</property> <!– 數據庫用戶名–> <property name=”connection.username”>root</property> <!– 數據庫密碼–> <property name=”connection.password”>root</property> <!—映射文件 –> <mapping resource=”com/amigo/pojo/User.hbm.xml”/> <mapping resource=”com/amigo/pojo/Org.hbm.xml”/> </session-factory> </hibernate-configuration>
上面使用的驅動類是com.mysql.jdbc.Driver。需要將MySql的連接器jar包(eg. mysql-connector-java-5.0.4-bin.jar)加入到classpath中。
6. Sql Server連接配置
本小節講述一下Sql Server數據庫的hibernate連接設置,在此只給出連接部分的內容,其余部分與2.2.1.5一樣,在此不再贅述。內容如下:
本小節講述一下Sql Server數據庫的hibernate連接設置,在此只給出連接部分的內容,其余部分與2.2.1.5一樣,在此不再贅述。內容如下:
<!–驅動程序–> <property name=”connection.driver_class”>net.sourceforge.jtds.jdbc.Driver</property> <!– JDBC URL –> <property name=”connection.url”>jdbc:jtds:sqlserver://localhost:1433;DatabaseName=dbname</property> <!– 數據庫用戶名–> <property name=”connection.username”>sa</property> <!– 數據庫密碼–> <property name=”connection.password”></property>
上例的驅動類使用的是jtds的驅動類,因此讀者需要將jtds的jar包(eg. jtds-1.2.jar)加入到classpath中。
7. Oracle連接配置
來源:http://www.blogjava.net/amigoxie/archive/2007/12/29/171395.html
本小節講述一下Sql Server數據庫的hibernate連接設置,在此只給出連接部分的內容,其余部分與2.2.1.5一樣,在此不再贅述。內容如下:
來源:http://www.blogjava.net/amigoxie/archive/2007/12/29/171395.html
本小節講述一下Sql Server數據庫的hibernate連接設置,在此只給出連接部分的內容,其余部分與2.2.1.5一樣,在此不再贅述。內容如下:
<!–驅動程序–> <property name=”connection.driver_class”>oracle.jdbc.driver.OracleDriver</property> <!– JDBC URL –> <property name=”connection.url”>jdbc:oracle:thin:@localhost:1521:dbname</property> <!– 數據庫用戶名–> <property name=”connection.username”>test</property> <!– 數據庫密碼–> <property name=”connection.password”>test</property>
上例使用的驅動類為:oracle.jdbc.driver.OracleDriver,開發人員需要將相關的jar包(ojdbc14.jar)加入到classpath中。
二、hibernate配置屬性
來源:http://blog.csdn.net/wxytx88/archive/2009/03/26/4027216.aspx
表 3.3. Hibernate配置屬性
屬性名 用途
hibernate.dialect 一個Hibernate Dialect類名允許Hibernate針對特定的關系數據庫生成優化的SQL.
取值 full.classname.of.Dialect
hibernate.show_sql 輸出所有SQL語句到控制台. 有一個另外的選擇是把org.hibernate.SQL這個log category設為debug。
eg. true | false
hibernate.format_sql 在log和console中打印出更漂亮的SQL。
取值 true | false
hibernate.default_schema 在生成的SQL中, 將給定的schema/tablespace附加於非全限定名的表名上.
取值 SCHEMA_NAME
hibernate.default_catalog 在生成的SQL中, 將給定的catalog附加於非全限定名的表名上.
取值 CATALOG_NAME
hibernate.session_factory_name SessionFactory創建后,將自動使用這個名字綁定到JNDI中.
取值 jndi/composite/name
hibernate.max_fetch_depth 為單向關聯(一對一, 多對一)的外連接抓取(outer join fetch)樹設置最大深度. 值為0意味着將關閉默認的外連接抓取.
取值 建議在0到3之間取值
hibernate.default_batch_fetch_size 為Hibernate關聯的批量抓取設置默認數量.
取值 建議的取值為4, 8, 和16
hibernate.default_entity_mode 為由這個SessionFactory打開的所有Session指定默認的實體表現模式.
取值 dynamic-map, dom4j, pojo
hibernate.order_updates 強制Hibernate按照被更新數據的主鍵,為SQL更新排序。這么做將減少在高並發系統中事務的死鎖。
取值 true | false
hibernate.generate_statistics 如果開啟, Hibernate將收集有助於性能調節的統計數據.
取值 true | false
hibernate.use_identifer_rollback 如果開啟, 在對象被刪除時生成的標識屬性將被重設為默認值.
取值 true | false
hibernate.use_sql_comments 如果開啟, Hibernate將在SQL中生成有助於調試的注釋信息, 默認值為false.
取值 true | false
表 3.4. Hibernate JDBC和連接(connection)屬性
屬性名 用途 hibernate.jdbc.fetch_size 非零值,指定JDBC抓取數量的大小 (調用Statement.setFetchSize()). hibernate.jdbc.batch_size 非零值,允許Hibernate使用JDBC2的批量更新. 取值 建議取5到30之間的值 hibernate.jdbc.batch_versioned_data 如果你想讓你的JDBC驅動從executeBatch()返回正確的行計數 , 那么將此屬性設為true(開啟這個選項通常是安全的). 同時,Hibernate將為自動版本化的數據使用批量DML. 默認值為false. eg. true | false hibernate.jdbc.factory_class 選擇一個自定義的Batcher. 多數應用程序不需要這個配置屬性. eg. classname.of.Batcher hibernate.jdbc.use_scrollable_resultset 允許Hibernate使用JDBC2的可滾動結果集. 只有在使用用戶提供的JDBC連接時,這個選項才是必要的, 否則Hibernate會使用連接的元數據. 取值 true | false hibernate.jdbc.use_streams_for_binary 在JDBC讀寫binary (二進制)或serializable (可序列化) 的類型時使用流(stream)(系統級屬性). 取值 true | false hibernate.jdbc.use_get_generated_keys 在數據插入數據庫之后,允許使用JDBC3 PreparedStatement.getGeneratedKeys() 來獲取數據庫生成的key(鍵)。需要JDBC3+驅動和JRE1.4+, 如果你的數據庫驅動在使用Hibernate的標 識生成器時遇到問題,請將此值設為false. 默認情況下將使用連接的元數據來判定驅動的能力. 取值 true|false hibernate.connection.provider_class 自定義ConnectionProvider的類名, 此類用來向Hibernate提供JDBC連接. 取值 classname.of.ConnectionProvider hibernate.connection.isolation 設置JDBC事務隔離級別. 查看java.sql.Connection來了解各個值的具體意義, 但請注意多數數據庫都不支持所有的隔離級別. 取值 1, 2, 4, 8 hibernate.connection.autocommit 允許被緩存的JDBC連接開啟自動提交(autocommit) (不建議). 取值 true | false hibernate.connection.release_mode 指定Hibernate在何時釋放JDBC連接. 默認情況下,直到Session被顯式關閉或被斷開連接時,才會釋放JDBC連接. 對於應用程序服務器的JTA數據源, 你應當使用after_statement, 這樣在每次JDBC調用后,都會主動的釋放連接. 對於非JTA的連接, 使用after_transaction在每個事務結束時釋放連接是合理的. auto將為JTA和CMT事務策略選擇after_statement, 為JDBC事務策略選擇after_transaction. 取值 auto (默認) | on_close | after_transaction | after_statement 注意,這些設置僅對通過SessionFactory.openSession得到的Session起作用。對於通過 SessionFactory.getCurrentSession得到的Session,所配置的CurrentSessionContext實現控制 這些Session的連接釋放模式。請參閱第 2.5 節 “上下文相關的(Contextual)Session”。 hibernate.connection.<propertyName> 將JDBC屬性propertyName傳遞到DriverManager.getConnection()中去. hibernate.jndi.<propertyName> 將屬性propertyName傳遞到JNDI InitialContextFactory中去.
表 3.5. Hibernate緩存屬性
屬性名 用途 hibernate.cache.provider_class 自定義的CacheProvider的類名. 取值 classname.of.CacheProvider hibernate.cache.use_minimal_puts 以頻繁的讀操作為代價, 優化二級緩存來最小化寫操作. 在Hibernate3中,這個設置對的集群緩存非常有用, 對集群緩存的實現而言,默認是開啟的. 取值 true|false hibernate.cache.use_query_cache 允許查詢緩存, 個別查詢仍然需要被設置為可緩存的. 取值 true|false hibernate.cache.use_second_level_cache 能用來完全禁止使用二級緩存. 對那些在類的映射定義中指定<cache>的類,會默認開啟二級緩存. 取值 true|false hibernate.cache.query_cache_factory 自定義實現QueryCache接口的類名, 默認為內建的StandardQueryCache. 取值 classname.of.QueryCache hibernate.cache.region_prefix 二級緩存區域名的前綴. 取值 prefix hibernate.cache.use_structured_entries 強制Hibernate以更人性化的格式將數據存入二級緩存. 取值 true|false
表 3.6. Hibernate事務屬性
屬性名 用途
hibernate.transaction.factory_class 一個TransactionFactory的類名, 用於Hibernate Transaction API (默認為JDBCTransactionFactory).
取值 classname.of.TransactionFactory
jta.UserTransaction 一個JNDI名字,被JTATransactionFactory用來從應用服務器獲取JTA UserTransaction.
取值 jndi/composite/name
hibernate.transaction.manager_lookup_class 一個TransactionManagerLookup的類名 – 當使用JVM級緩存,或在JTA環境中使用hilo生成器的時候需要該類.
取值 classname.of.TransactionManagerLookup
hibernate.transaction.flush_before_completion 如果開啟, session在事務完成后將被自動清洗(flush)。 現在更好的方法是使用自動session上下文管理。請參見第 2.5 節 “上下文相關的(Contextual)Session”。
取值 true | false
hibernate.transaction.auto_close_session 如果開啟, session在事務完成后將被自動關閉。 現在更好的方法是使用自動session上下文管理。請參見第 2.5 節 “上下文相關的(Contextual)Session”。
取值 true | false
表 3.7. 其他屬性
屬性名 用途
hibernate.current_session_context_class 為”當前” Session指定一個(自定義的)策略。關於內置策略的詳情,請參見第 2.5 節 “上下文相關的(Contextual)Session” 。
eg. jta | thread | managed | custom.Class
hibernate.query.factory_class 選擇HQL解析器的實現.
取值 org.hibernate.hql.ast.ASTQueryTranslatorFactory or org.hibernate.hql.classic.ClassicQueryTranslatorFactory
hibernate.query.substitutions 將Hibernate查詢中的符號映射到SQL查詢中的符號 (符號可能是函數名或常量名字).
取值 hqlLiteral=SQL_LITERAL, hqlFunction=SQLFUNC
hibernate.hbm2ddl.auto 在SessionFactory創建時,自動檢查數據庫結構,或者將數據庫schema的DDL導出到數據庫. 使用 create-drop時,在顯式關閉SessionFactory時,將drop掉數據庫schema.
取值 validate | update | create | create-drop
hibernate.cglib.use_reflection_optimizer 開啟CGLIB來替代運行時反射機制(系統級屬性). 反射機制有時在除錯時比較有用. 注意即使關閉這個優化, Hibernate還是需要CGLIB. 你不能在hibernate.cfg.xml中設置此屬性.
取值 true | false
3.4.1. SQL方言
你應當總是為你的數據庫將hibernate.dialect屬性設置成正確的 org.hibernate.dialect.Dialect子類. 如果你指定一種方言, Hibernate將為上面列出的一些屬性使用合理的默認值, 為你省去了手工指定它們的功夫.
你應當總是為你的數據庫將hibernate.dialect屬性設置成正確的 org.hibernate.dialect.Dialect子類. 如果你指定一種方言, Hibernate將為上面列出的一些屬性使用合理的默認值, 為你省去了手工指定它們的功夫.
表 3.8. Hibernate SQL方言 (hibernate.dialect)
RDBMS 方言
DB2 org.hibernate.dialect.DB2Dialect
DB2 AS/400 org.hibernate.dialect.DB2400Dialect
DB2 OS390 org.hibernate.dialect.DB2390Dialect
PostgreSQL org.hibernate.dialect.PostgreSQLDialect
MySQL org.hibernate.dialect.MySQLDialect
MySQL with InnoDB org.hibernate.dialect.MySQLInnoDBDialect
MySQL with MyISAM org.hibernate.dialect.MySQLMyISAMDialect
Oracle (any version) org.hibernate.dialect.OracleDialect
Oracle 9i/10g org.hibernate.dialect.Oracle9Dialect
Sybase org.hibernate.dialect.SybaseDialect
Sybase Anywhere org.hibernate.dialect.SybaseAnywhereDialect
Microsoft SQL Server org.hibernate.dialect.SQLServerDialect
SAP DB org.hibernate.dialect.SAPDBDialect
Informix org.hibernate.dialect.InformixDialect
HypersonicSQL org.hibernate.dialect.HSQLDialect
Ingres org.hibernate.dialect.IngresDialect
Progress org.hibernate.dialect.ProgressDialect
Mckoi SQL org.hibernate.dialect.MckoiDialect
Interbase org.hibernate.dialect.InterbaseDialect
Pointbase org.hibernate.dialect.PointbaseDialect
FrontBase org.hibernate.dialect.FrontbaseDialect
Firebird org.hibernate.dialect.FirebirdDialect
DB2 org.hibernate.dialect.DB2Dialect
DB2 AS/400 org.hibernate.dialect.DB2400Dialect
DB2 OS390 org.hibernate.dialect.DB2390Dialect
PostgreSQL org.hibernate.dialect.PostgreSQLDialect
MySQL org.hibernate.dialect.MySQLDialect
MySQL with InnoDB org.hibernate.dialect.MySQLInnoDBDialect
MySQL with MyISAM org.hibernate.dialect.MySQLMyISAMDialect
Oracle (any version) org.hibernate.dialect.OracleDialect
Oracle 9i/10g org.hibernate.dialect.Oracle9Dialect
Sybase org.hibernate.dialect.SybaseDialect
Sybase Anywhere org.hibernate.dialect.SybaseAnywhereDialect
Microsoft SQL Server org.hibernate.dialect.SQLServerDialect
SAP DB org.hibernate.dialect.SAPDBDialect
Informix org.hibernate.dialect.InformixDialect
HypersonicSQL org.hibernate.dialect.HSQLDialect
Ingres org.hibernate.dialect.IngresDialect
Progress org.hibernate.dialect.ProgressDialect
Mckoi SQL org.hibernate.dialect.MckoiDialect
Interbase org.hibernate.dialect.InterbaseDialect
Pointbase org.hibernate.dialect.PointbaseDialect
FrontBase org.hibernate.dialect.FrontbaseDialect
Firebird org.hibernate.dialect.FirebirdDialect
三、PO.hbm.xml屬性詳解
1. <meta>元素的屬性
屬性 描述
class-description 指定描述類的javaDoc
field-description 指定描述類的屬性javaDoc
interface 如果為true,表明生成接口而非類,默認false
implements 指定類所實現的接口
extends 指定繼承的父類名
generated-class 重新指定生成的類名
scope-class 指定類的修飾符,默認public
scope-set 指定set方法的修飾符,默認public
scope-get 指定get方法的修飾符,默認public
scope-field 指定類的屬性的修飾符,默認private
use-in-toString 如果為true,表示在toString()方法中包含此屬性
gen-property 如果為false,不會在java類中生成此屬性,默認true
finder-method 指定find方法名
2. <column>元素屬性
name 設定字段名字
length 設定字段長度
not-null 如為true,指名該字段不允許為null,默認false
unique 如為true,指名該字段具有唯一約束,默認false
index 給一個或多個字段建立索引
unique-key 為多個字段設定唯一約束
foreign-key 為外鍵約束命名,在<many-to-many><one-to-one><key><many-to-one>元素中包含
foreign-key屬性,在雙向關聯中,inverse屬性為true的一端不能設置foreign-key
sql-type 設定字段sql類型
check 設定sql檢查約束
3. 用於控制insert or update 語句的映射屬性
class-description 指定描述類的javaDoc
field-description 指定描述類的屬性javaDoc
interface 如果為true,表明生成接口而非類,默認false
implements 指定類所實現的接口
extends 指定繼承的父類名
generated-class 重新指定生成的類名
scope-class 指定類的修飾符,默認public
scope-set 指定set方法的修飾符,默認public
scope-get 指定get方法的修飾符,默認public
scope-field 指定類的屬性的修飾符,默認private
use-in-toString 如果為true,表示在toString()方法中包含此屬性
gen-property 如果為false,不會在java類中生成此屬性,默認true
finder-method 指定find方法名
2. <column>元素屬性
name 設定字段名字
length 設定字段長度
not-null 如為true,指名該字段不允許為null,默認false
unique 如為true,指名該字段具有唯一約束,默認false
index 給一個或多個字段建立索引
unique-key 為多個字段設定唯一約束
foreign-key 為外鍵約束命名,在<many-to-many><one-to-one><key><many-to-one>元素中包含
foreign-key屬性,在雙向關聯中,inverse屬性為true的一端不能設置foreign-key
sql-type 設定字段sql類型
check 設定sql檢查約束
3. 用於控制insert or update 語句的映射屬性
<property>元素的insert屬性 如為false,在insert中不包含該字段,默認為true
<property>元素的update屬性 如為false,在update中不包含該字段,默認為true
<class>元素的mutable屬性 如為false,等價於所有字段的update屬性為false,默認為true
<property>元素的dunameic-insert屬性 如為true,表明動態生成insert語句,只有不為null,才會包含insert語句中,默認false
<property>元素的dunameic-update屬性 如為true,表明動態生成update語句,只有不為null,才會包含insert語句中,默認false
<class>元素的dunameic-insert屬性 如為true,表明等價於所有字段動態生成insert語句,只有不為null,才會包含insert語句 中 ,默認false
<class>元素的dunameic-update屬性 如為true,表明等價於所有字段動態生成update語句,只有不為null,才會包含insert語句 中 ,默認false
<property>元素的update屬性 如為false,在update中不包含該字段,默認為true
<class>元素的mutable屬性 如為false,等價於所有字段的update屬性為false,默認為true
<property>元素的dunameic-insert屬性 如為true,表明動態生成insert語句,只有不為null,才會包含insert語句中,默認false
<property>元素的dunameic-update屬性 如為true,表明動態生成update語句,只有不為null,才會包含insert語句中,默認false
<class>元素的dunameic-insert屬性 如為true,表明等價於所有字段動態生成insert語句,只有不為null,才會包含insert語句 中 ,默認false
<class>元素的dunameic-update屬性 如為true,表明等價於所有字段動態生成update語句,只有不為null,才會包含insert語句 中 ,默認false
4. Hibernate提供的內置標識符生成器
increment 適用於代理主鍵,自動遞增,增1(只能是long,int,short)
identity 適用於代理主鍵,底層數據庫自動增長字段類型(數據庫需支持,只能是long,int,short)
(oralce)sequence 適用於代理主鍵,根據底層數據庫的序列來生成標識符(數據庫支持序列,只能是long,int,short)
hilo 適用於代理主鍵,根據high/low算法來生成.Hibernate把特定表的字段作為high值,在默認情況下選用hibernate_unique_key表的next_hi字段
(mysql,mssql)native 適用於代理主鍵,根據數據庫自動生成標識符支持能力,來選擇identity,sequence,hilo
uuid.hex 適用於代理主鍵,采用128位UUID(universal unique identification)算法來生成標識.此算法能在網絡環境中生成唯一的字符串標識符,
(不建議使用,字符串類型比整形類型的主鍵占用更多的空間)
assigned 適用於自然主鍵,由java程序負責生成.
increment 適用於代理主鍵,自動遞增,增1(只能是long,int,short)
identity 適用於代理主鍵,底層數據庫自動增長字段類型(數據庫需支持,只能是long,int,short)
(oralce)sequence 適用於代理主鍵,根據底層數據庫的序列來生成標識符(數據庫支持序列,只能是long,int,short)
hilo 適用於代理主鍵,根據high/low算法來生成.Hibernate把特定表的字段作為high值,在默認情況下選用hibernate_unique_key表的next_hi字段
(mysql,mssql)native 適用於代理主鍵,根據數據庫自動生成標識符支持能力,來選擇identity,sequence,hilo
uuid.hex 適用於代理主鍵,采用128位UUID(universal unique identification)算法來生成標識.此算法能在網絡環境中生成唯一的字符串標識符,
(不建議使用,字符串類型比整形類型的主鍵占用更多的空間)
assigned 適用於自然主鍵,由java程序負責生成.
5. <hibernate-mapping>
<class name=”項目路徑” table=”庫中對應表名” schema=”dbo” catalog=”netoa”>
<meta attribute=”class-description”>指定描述類的javaDoc</meta>
<meta attribute=”class-scope”>指名類的修飾類型</meta>
<meta attribute=”extends”>指定繼承類</meta>
<id name=”bgrkbh” type=”long”>
<column name=”BGRKBH” precision=”15″ scale=”0″ sql-type=”庫中類型” check=”BGRKBH>10″/>
<meta attribute=”scope-set”>指定類,類屬性的getxxx(),setxxx()方法的修飾符
包括:static,final,abstract,public,protected,private
</meta>
<generator />
</id>
<property name=”Class.fileName” type=”long”>
<column name=”YSLX” precision=”精度” scale=”刻度” not-null=”默認false” sql-type=”數據庫中類型”/>
附加屬性不會影響Hibernate的運行行為
<meta attribute=”field-description”>指定描述類的javaDoc</meta>
指定描述類屬性的javaDoc
</property>
</class>
</hibernate-mapping>
注意:
1 Session的commit()和flush()方法的區別,flush()方法進行清理緩存的操作,執行一系列的SQL語句,但不會提交事務;
commit()方法會先調用flush(),然后提交事務.提交事務意味着對數據庫所作的更新被永久保存下來.
<class name=”項目路徑” table=”庫中對應表名” schema=”dbo” catalog=”netoa”>
<meta attribute=”class-description”>指定描述類的javaDoc</meta>
<meta attribute=”class-scope”>指名類的修飾類型</meta>
<meta attribute=”extends”>指定繼承類</meta>
<id name=”bgrkbh” type=”long”>
<column name=”BGRKBH” precision=”15″ scale=”0″ sql-type=”庫中類型” check=”BGRKBH>10″/>
<meta attribute=”scope-set”>指定類,類屬性的getxxx(),setxxx()方法的修飾符
包括:static,final,abstract,public,protected,private
</meta>
<generator />
</id>
<property name=”Class.fileName” type=”long”>
<column name=”YSLX” precision=”精度” scale=”刻度” not-null=”默認false” sql-type=”數據庫中類型”/>
附加屬性不會影響Hibernate的運行行為
<meta attribute=”field-description”>指定描述類的javaDoc</meta>
指定描述類屬性的javaDoc
</property>
</class>
</hibernate-mapping>
注意:
1 Session的commit()和flush()方法的區別,flush()方法進行清理緩存的操作,執行一系列的SQL語句,但不會提交事務;
commit()方法會先調用flush(),然后提交事務.提交事務意味着對數據庫所作的更新被永久保存下來.
2 Session的setFlushMode()方法用於設定清理緩存的時間點.FlushMode類定義了三種不同的清理模式
清理緩存的模式 Session的查詢方法 Session的commit()方法 Session的flush()方法
FlushMode.AUTO 清理 清理 清理
FlushMode.COMMIT 不清理 清理 清理
FlushMode.NEVER 不清理 不清理 清理
FlushMode.AUTO 清理 清理 清理
FlushMode.COMMIT 不清理 清理 清理
FlushMode.NEVER 不清理 不清理 清理
3 Hibernate應用中java對象的狀態
臨時狀態 (transient):剛剛用new語句創建,還沒被持久化,不處與Session的緩存中,處於臨時狀態的java對象被稱為臨時對象.
持久化狀態(persistent):已經被持久化,加入session的緩存中.處於持久化狀態的java對象被稱為持久化對象.
游離狀態(detached):已經被持久化,但不在處於session的緩存中.處於游離狀態的java對象被稱為游離對象.
(注意:::::)持久化類與持久化對象是不同的概念.持久化類的實例可以處於臨時狀態,持久化狀態和游離狀態.其中處於
持久化狀態的實例 被稱為持久化狀態.
臨時狀態 (transient):剛剛用new語句創建,還沒被持久化,不處與Session的緩存中,處於臨時狀態的java對象被稱為臨時對象.
持久化狀態(persistent):已經被持久化,加入session的緩存中.處於持久化狀態的java對象被稱為持久化對象.
游離狀態(detached):已經被持久化,但不在處於session的緩存中.處於游離狀態的java對象被稱為游離對象.
(注意:::::)持久化類與持久化對象是不同的概念.持久化類的實例可以處於臨時狀態,持久化狀態和游離狀態.其中處於
持久化狀態的實例 被稱為持久化狀態.
6. 臨時對象的特性:
1 不處於緩存中,也可以說,不被任何一個Session實例關聯
2 在數據中沒有對應的紀錄.
1 不處於緩存中,也可以說,不被任何一個Session實例關聯
2 在數據中沒有對應的紀錄.
在此情況下,java對象進入臨時狀態
1 當通過new創建一個對象時,此時不和數據庫中的任何紀錄的
1 當通過new創建一個對象時,此時不和數據庫中的任何紀錄的
ex:對象的狀態轉化過程
程序代碼 對象的生命周期 對象的狀態
tx=session.beginTransaction();
Object obj=new Object(“tow”,new HashSet()); 開始生命周期 臨時狀態
tx=session.beginTransaction();
Object obj=new Object(“tow”,new HashSet()); 開始生命周期 臨時狀態
session.save(obj); 處於生命周期 轉化為持久狀態
Long id=obj.getId();
obj=null;
Object obj2=(Object)session.load(Object.class,id); 處於生命周期 處於持久化狀態
tx.commit();
obj=null;
Object obj2=(Object)session.load(Object.class,id); 處於生命周期 處於持久化狀態
tx.commit();
session.close(); 處於生命周期 轉變成游離狀態
System.out.print(obj2.getName()); 處於生命周期 處於游離狀態
obj2=null; 結束生命周期 結束生命周期
7. cascade屬性:
cascade屬性值 描述
none 在保存更新時,忽略其他關聯對象,他是cascade默認屬性
save-update 當通過Session的save(),update()以及saveOrUpdate()方法來保存
或更新當前對象時,及聯保存所有關聯的新建的臨時對象,並且及聯更新所有關聯的游離對象
delete 當通過session的delete()方法刪除當前對象時,及聯刪除所有對象
all 包含save-update及delete行為,此外對當前對象執行evict()或lock
()操作時,也會對所有關聯的持久化對象執行evict()或lock()操作
delete-orphan 刪除所有和當前對象解除關聯關系的對象
all-delete-orphan 包含all和delete-orphan
none 在保存更新時,忽略其他關聯對象,他是cascade默認屬性
save-update 當通過Session的save(),update()以及saveOrUpdate()方法來保存
或更新當前對象時,及聯保存所有關聯的新建的臨時對象,並且及聯更新所有關聯的游離對象
delete 當通過session的delete()方法刪除當前對象時,及聯刪除所有對象
all 包含save-update及delete行為,此外對當前對象執行evict()或lock
()操作時,也會對所有關聯的持久化對象執行evict()或lock()操作
delete-orphan 刪除所有和當前對象解除關聯關系的對象
all-delete-orphan 包含all和delete-orphan
8. Hibernate映射類型,對應的java基本類型及對應的標准SQL類型類型類型:
映射類型 java 類型 標准 sql 類型
integer int or Integer INTEGER
long long or java.lang.Long BIGINT
short short or java.lang.Short SMALLINT
float float or java.lang.Float FLOAT
double double or java.lang.Double DOUBLE
big_decimal java.math.BigDecimal NUMERIC
character java.lang.String CHAR(1)
string java.lang.String VARCHAR
byte byte or java.lang.Byte TINYINT
boolean boolean or java.lang.Boolean BIT
yes_no boolean or java.lang.Boolean CHAR(1)(‘Y’ or ’N')
true_false boolean or java.lang.Boolean CHAR(1)(‘Y’ or ’N')
date java.util.Date or java.sql.Date DATE
time java.util.Date or java.sql.Time TIME
timestamp java.util.Date or java.sql.TimeStamp TIMESTAMP
calendar java.util.Calendar TIMESTAMP
calendar_date java.util.Calendar DATE
binary byte[] VARBINARY( or BLOB)
text java.lang.String CLOB
serializable java.io.Serializable VARBINARY (or BLOB)
clob java.sql.Clob CLOB
blob java.sql.Blob BLOB
class java.lang.Class VARCHAR
locale java.util.Locale VARCHAR
timezone java.util.TimeZone VARCHAR
currency java.util.Currency VARCHAR
long long or java.lang.Long BIGINT
short short or java.lang.Short SMALLINT
float float or java.lang.Float FLOAT
double double or java.lang.Double DOUBLE
big_decimal java.math.BigDecimal NUMERIC
character java.lang.String CHAR(1)
string java.lang.String VARCHAR
byte byte or java.lang.Byte TINYINT
boolean boolean or java.lang.Boolean BIT
yes_no boolean or java.lang.Boolean CHAR(1)(‘Y’ or ’N')
true_false boolean or java.lang.Boolean CHAR(1)(‘Y’ or ’N')
date java.util.Date or java.sql.Date DATE
time java.util.Date or java.sql.Time TIME
timestamp java.util.Date or java.sql.TimeStamp TIMESTAMP
calendar java.util.Calendar TIMESTAMP
calendar_date java.util.Calendar DATE
binary byte[] VARBINARY( or BLOB)
text java.lang.String CLOB
serializable java.io.Serializable VARBINARY (or BLOB)
clob java.sql.Clob CLOB
blob java.sql.Blob BLOB
class java.lang.Class VARCHAR
locale java.util.Locale VARCHAR
timezone java.util.TimeZone VARCHAR
currency java.util.Currency VARCHAR