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意味着將關閉默認的外連接抓取.

取值 建議在03之間取值

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的批量更新.

取值 建議取530之間的值

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


你應當總是爲你的數據庫將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

 

一、 環境搭建和基本映射
 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映射。

發佈了130 篇原創文章 · 獲贊 15 · 訪問量 30萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章