屬性名 | 用途 |
---|---|
hibernate.dialect |
一個Hibernate Dialect 類名允許Hibernate針對特定的關係數據庫生成優化的SQL.
取值 |
hibernate.show_sql |
輸出所有SQL語句到控制檯. 有一個另外的選擇是把org.hibernate.SQL 這個log category設爲debug 。
eg. |
hibernate.format_sql |
在log和console中打印出更漂亮的SQL。
取值 |
hibernate.default_schema |
在生成的SQL中, 將給定的schema/tablespace附加於非全限定名的表名上.
取值 |
hibernate.default_catalog |
在生成的SQL中, 將給定的catalog附加於非全限定名的表名上.
取值 |
hibernate.session_factory_name |
SessionFactory 創建後,將自動使用這個名字綁定到JNDI中.
取值 |
hibernate.max_fetch_depth |
爲單向關聯(一對一, 多對一)的外連接抓取(outer join fetch)樹設置最大深度. 值爲0 意味着將關閉默認的外連接抓取.
取值 建議在 |
hibernate.default_batch_fetch_size |
爲Hibernate關聯的批量抓取設置默認數量.
取值 建議的取值爲 |
hibernate.default_entity_mode |
爲由這個SessionFactory 打開的所有Session指定默認的實體表現模式.
取值 |
hibernate.order_updates |
強制Hibernate按照被更新數據的主鍵,爲SQL更新排序。這麼做將減少在高併發系統中事務的死鎖。
取值 |
hibernate.generate_statistics |
如果開啓, Hibernate將收集有助於性能調節的統計數據.
取值 |
hibernate.use_identifer_rollback |
如果開啓, 在對象被刪除時生成的標識屬性將被重設爲默認值.
取值 |
hibernate.use_sql_comments |
如果開啓, Hibernate將在SQL中生成有助於調試的註釋信息, 默認值爲false .
取值 |
表 3.4. Hibernate JDBC和連接(connection)屬性
屬性名 | 用途 |
---|---|
hibernate.jdbc.fetch_size |
非零值,指定JDBC抓取數量的大小 (調用Statement.setFetchSize() ). |
hibernate.jdbc.batch_size |
非零值,允許Hibernate使用JDBC2的批量更新.
取值 建議取 |
hibernate.jdbc.batch_versioned_data |
如果你想讓你的JDBC驅動從executeBatch() 返回正確的行計數 , 那麼將此屬性設爲true (開啓這個選項通常是安全的). 同時,Hibernate將爲自動版本化的數據使用批量DML. 默認值爲false .
eg. |
hibernate.jdbc.factory_class |
選擇一個自定義的Batcher . 多數應用程序不需要這個配置屬性.
eg. |
hibernate.jdbc.use_scrollable_resultset |
允許Hibernate使用JDBC2的可滾動結果集. 只有在使用用戶提供的JDBC連接時,這個選項纔是必要的, 否則Hibernate會使用連接的元數據.
取值 |
hibernate.jdbc.use_streams_for_binary |
在JDBC讀寫binary (二進制) 或serializable (可序列化) 的類型時使用流(stream)(系統級屬性).
取值 |
hibernate.jdbc.use_get_generated_keys |
在數據插入數據庫之後,允許使用JDBC3 PreparedStatement.getGeneratedKeys() 來獲取數據庫生成的key(鍵)。需要JDBC3+驅動和JRE1.4+, 如果你的數據庫驅動在使用Hibernate的標 識生成器時遇到問題,請將此值設爲false. 默認情況下將使用連接的元數據來判定驅動的能力.
取值 |
hibernate.connection.provider_class |
自定義ConnectionProvider 的類名, 此類用來向Hibernate提供JDBC連接.
取值 |
hibernate.connection.isolation |
設置JDBC事務隔離級別. 查看java.sql.Connection 來了解各個值的具體意義, 但請注意多數數據庫都不支持所有的隔離級別.
取值 |
hibernate.connection.autocommit |
允許被緩存的JDBC連接開啓自動提交(autocommit) (不建議).
取值 |
hibernate.connection.release_mode |
指定Hibernate在何時釋放JDBC連接. 默認情況下,直到Session被顯式關閉或被斷開連接時,纔會釋放JDBC連接. 對於應用程序服務器的JTA數據源, 你應當使用after_statement , 這樣在每次JDBC調用後,都會主動的釋放連接. 對於非JTA的連接, 使用after_transaction 在每個事務結束時釋放連接是合理的. auto 將爲JTA和CMT事務策略選擇after_statement , 爲JDBC事務策略選擇after_transaction .
取值 注意,這些設置僅對通過 |
hibernate.connection.<propertyName> |
將JDBC屬性propertyName 傳遞到DriverManager.getConnection() 中去. |
hibernate.jndi.<propertyName> |
將屬性propertyName 傳遞到JNDI InitialContextFactory 中去. |
屬性名 | 用途 |
---|---|
hibernate.cache.provider_class |
自定義的CacheProvider 的類名.
取值 |
hibernate.cache.use_minimal_puts |
以頻繁的讀操作爲代價, 優化二級緩存來最小化寫操作. 在Hibernate3中,這個設置對的集羣緩存非常有用, 對集羣緩存的實現而言,默認是開啓的.
取值 |
hibernate.cache.use_query_cache |
允許查詢緩存, 個別查詢仍然需要被設置爲可緩存的.
取值 |
hibernate.cache.use_second_level_cache |
能用來完全禁止使用二級緩存. 對那些在類的映射定義中指定<cache> 的類,會默認開啓二級緩存.
取值 |
hibernate.cache.query_cache_factory |
自定義實現QueryCache 接口的類名, 默認爲內建的StandardQueryCache .
取值 |
hibernate.cache.region_prefix |
二級緩存區域名的前綴.
取值 |
hibernate.cache.use_structured_entries |
強制Hibernate以更人性化的格式將數據存入二級緩存.
取值 |
屬性名 | 用途 |
---|---|
hibernate.transaction.factory_class |
一個TransactionFactory 的類名, 用於Hibernate Transaction API (默認爲JDBCTransactionFactory ).
取值 |
jta.UserTransaction |
一個JNDI名字,被JTATransactionFactory 用來從應用服務器獲取JTA UserTransaction .
取值 |
hibernate.transaction.manager_lookup_class |
一個TransactionManagerLookup 的類名 - 當使用JVM級緩存,或在JTA環境中使用hilo生成器的時候需要該類.
取值 |
hibernate.transaction.flush_before_completion |
如果開啓, session在事務完成後將被自動清洗(flush)。 現在更好的方法是使用自動session上下文管理。請參見第 2.5 節 “上下文相關的(Contextual)Session”。
取值 |
hibernate.transaction.auto_close_session |
如果開啓, session在事務完成後將被自動關閉。 現在更好的方法是使用自動session上下文管理。請參見第 2.5 節 “上下文相關的(Contextual)Session”。
取值 |
屬性名 | 用途 |
---|---|
hibernate.current_session_context_class |
爲"當前" Session 指定一個(自定義的)策略。關於內置策略的詳情,請參見第 2.5 節 “上下文相關的(Contextual)Session” 。
eg. |
hibernate.query.factory_class |
選擇HQL解析器的實現.
取值 |
hibernate.query.substitutions |
將Hibernate查詢中的符號映射到SQL查詢中的符號 (符號可能是函數名或常量名字).
取值 |
hibernate.hbm2ddl.auto |
在SessionFactory 創建時,自動檢查數據庫結構,或者將數據庫schema的DDL導出到數據庫. 使用 create-drop 時,在顯式關閉SessionFactory 時,將drop掉數據庫schema.
取值 |
hibernate.cglib.use_reflection_optimizer |
開啓CGLIB來替代運行時反射機制(系統級屬性). 反射機制有時在除錯時比較有用. 注意即使關閉這個優化, Hibernate還是需要CGLIB. 你不能在hibernate.cfg.xml 中設置此屬性.
取值 |
表 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 |
一、 環境搭建和基本映射
1) 添加Annotation包:
hibernate-annotations.jar,ejb3-persistence.jar,hibernate-commons-annotations.jar
2) 在實體類中儘量使用JPA的標準註解來進行對象關係映射。註解可以添加在屬
一、 環境搭建和基本映射
1) 添加Annotation包:
hibernate-annotations.jar,ejb3-persistence.jar,hibernate-commons-annotations.jar
2) 在實體類中儘量使用JPA的標準註解來進行對象關係映射。註解可以添加在屬性上,也可以添加在getXxx()方法之上。
a) @Entity 映射一個實體類
@Table(name="表名") 指定關聯的表
b) @Id 映射OID
c) @GeneratedValue(strategy=生成策略) 指定OID的生成策略。
它的默認值是GenerationType.AUTO,相當於xml時的native。
如果不使用此註解定義Id,就將使用手動指定OID值。JPA註解默認沒提供uuid方式。
d) @Version 映射版本號屬性(樂觀鎖)
e) @Column(name="列名",nullable=true,unique=true) 指定屬性對應列的信息。
f) @Temporal(TemporalType.TIMESTAMP) 指定日期時間的類型。(TIMESTAMP,DATE,TIME)
g) 簡單屬性可以不用註解。默認就是@Basic
h) @Transient 指定屬性不需要持久化.
i) 複雜屬性:關聯,繼承,組件,聯合主鍵.
3) 在Hibernate全局配置文件中使用聲明映射類的方式:<mapping class="實體類的全限定名"/>
4) 使用Annotation來映射對象關係時,加載Hibernate全局配置文件要使用AnnotationConfiguration類,如下代碼:
SessionFactory factory = new AnnotationConfiguration().configure().buildSessionFactory();
5) 持久化操作與之前沒有區別。
二、映射關聯關係
1. 映射多對一
1) @ManyToOne
2) 指定關聯列@JoinColumn(name="xxx_id")
2. 映射一對多
1) @OneToMany 默認會使用連接表做一對多的關聯。
2) 添加@JoinColumn(name="xxx_id")後,就會使用外鍵關聯,而不使用連接表了。
3. 映射雙向一對多
1) 在多端:
@ManyToOne
@JoinColumn(name="外鍵名")
2) 在一端:(一對多關聯,把關係維護權交給多端更有效率)
@OneToMany(mappedBy="多端的關聯屬性名")
@JoinColumn(name="外鍵名")
4. mappedBy屬性:用在雙向關聯中,把關係的維護權反轉。跟hibernate XML映射中的property-ref一樣。
5. cascade屬性: 指定級聯操作的行爲(可多選)
CascadeType.PERSIST :調用JPA規範中的persist(),不適用於Hibernate的save()方法
CascadeType.MERGE:調用JPA規範中merge()時,不適用於Hibernate的update()方法
CascadeType.REMOVE:調用JPA規範中的remove()時,適用於Hibernate的delete()方法
CascadeType.REFRESH:調用JPA規範中的refresh()時,適用於Hibernate的flush()方法
CascadeType.ALL:JPA規範中的所有持久化方法。適用於Hibernate中的所有持久化方法
6. cascade屬性和mappedBy用在一起時,一定要通過調用雙方的set方法來建立關係。
7. 雙向一對一
1) 基於外鍵
a) 在主控方:@OneToOne
b) 在被控方:@OneToOne(mappedBy="對方的關聯屬性名")
2) 基於主鍵: JPA標準中沒有提供共享主鍵生成問題的標準方法,需要使用Hibernate的擴展。
a) 在主控方:Car
@Id
@GeneratedValue(generator="my-uuid")
@org.hibernate.annotations.GenericGenerator(name="my-uuid", strategy="uuid")
private String id;
@OneToOne(cascade={CascadeType.ALL})
@PrimaryKeyJoinColumn
private Brand brand;
b) 在被控方:Brand
@Id
@GeneratedValue(generator="myFG")
@org.hibernate.annotations.GenericGenerator(name="myFG",
strategy="foreign",parameters=@Parameter(name="property",value="car"))
private String id;
@OneToOne(mappedBy="brand")
private Car car;
8. 雙向多對多:最好由某一端來維護這個關係會更有效率.示例:學生與課程的多對多
1) 在主控方:
@ManyToMany
@JoinTable(name="student_course",
joinColumns={@JoinColumn(name="student_id")},
inverseJoinColumns={@JoinColumn(name="course_id")})
private Set<Course> courseSet = new HashSet<Course>();
2) 在被控方:
@ManyToMany(mappedBy="courseSet")
private Set<Student> stus = new HashSet<Student>();
3) 很多情況都需要把雙向多對多拆成兩個一對多: 1-->*<--1
三、高級映射
1. 繼承映射:
1) 整個繼承樹一張表
在父類中添加從下註解
@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="type",length=3)
@DiscriminatorValue("u")
子類中添加以下註解
@Entity
@DiscriminatorValue("w")
2) 每個子類一張表
在父類添加如下註解
@Entity
@Table(name="user")
@Inheritance(strategy=InheritanceType.JOINED)
在子類中跟普通實體類的映射相同
3) 每個具體類一張表:
在父類中
@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public class User {
@Id
@GeneratedValue(strategy=GenerationType.TABLE,generator="xxGen")
@TableGenerator(name="xxGen",allocationSize=1)
private Long id;
...
}
在子類中跟普通實體類的映射相同
2. 組件映射: 組件類上用@Emabbedable。在使用這個組件類的類上用:
@Emabbed
@AttributeOverrides({
@AttributeOverride(name="email", column=@Column(name="p_email")),
@AttributeOverride(name="address", column=@Column(name="p_address")),
@AttributeOverride(name="mobile", column=@Column(name="p_mobile"))
})
3. 聯合主鍵映射
1. 主鍵類:用@Emabbedable映射。並實現Serializable接口,使用主鍵屬性重寫hashCode()和equals()方法。
2. 使用這個主鍵類的類上還是用@Id映射。