Table 3.3. Hibernate配置属性
属性名 用途 
hibernate.dialect Hibernate方言(Dialect)的类名 - 可以让Hibernate使用某些特定的数据库平台的特性 
取值. full.classname.of.Dialect 
hibernate.default_schema 在生成的SQL中,scheml/tablespace的全限定名 
取值. SCHEMA_NAME 
hibernate.session_factory_name 把SessionFactory绑定到JNDI中去. 
取值. jndi/composite/name 
hibernate.use_outer_join 允许使用外连接抓取. 
取值. true | false 
hibernate.max_fetch_depth 设置外连接抓取树的最大深度 
取值. 建议设置为0到3之间 
hibernate.jdbc.fetch_size 一个非零值,用来决定JDBC的获取量大小。(会调用calls Statement.setFetchSize()). 
hibernate.jdbc.batch_size 一个非零值,会开启Hibernate使用JDBC2的批量更新功能 
取值. 建议值在 5 和 30之间。 
hibernate.jdbc.use_scrollable_resultset 允许Hibernate使用JDBC2提供的可滚动结果集。只有在使用用户自行提供的连接时,这个参数才是必需的。否则Hibernate会使用连接的元数据(metadata)。 
取值. true | false 
hibernate.jdbc.use_streams_for_binary 在从JDBC读写binary(二进制)或者serializable(可序列化)类型时,是否使用stream(流). 这是一个系统级别的属性。 
取值. true | false 
hibernate.cglib.use_reflection_optimizer 是否使用CGLIB来代替运行时反射操作。(系统级别属性,默认为在可能时都使用CGLIB).在调试的时候有时候使用反射会有用。 
取值. true | false 
hibernate.jndi.<propertyName> 把propertyName这个属性传递到JNDI InitialContextFactory去 (可选)  
hibernate.connection.isolation 事务隔离级别 (可选) 
取值. 1, 2, 4, 8 
hibernate.connection.<propertyName> 把 propertyName这个JDBC 属性传递到DriverManager.getConnection()去.  
hibernate.connection.provider_class 指定一个自定义的ConnectionProvider类名 
取值. classname.of.ConnectionProvider 
hibernate.cache.provider_class 指定一个自定义的CacheProvider缓存提供者的类名 
取值. classname.of.CacheProvider 
hibernate.cache.use_minimal_puts 优化第二层缓存操作,减少写操作,代价是读操作更频繁(对于集群缓存很有用) 
取值. true|false 
hibernate.cache.use_query_cache 打开查询缓存 
取值. true|false 
hibernate.cache.region_prefix 用于第二层缓存区域名字的前缀 
取值. prefix 
hibernate.transaction.factory_class 指定一个自定义的TransactionFactory类名,Hibernate Transaction API将会使用 
取值. classname.of.TransactionFactory 
jta.UserTransaction JTATransactionFactory 用来获取JTA UserTransaction的JNDI名 
取值. jndi/composite/name  
hibernate.transaction.manager_lookup_class TransactionManagerLookup的类名 - 当在JTA环境中,JVM级别的缓存被打开的时候使用 
取值. classname.of.TransactionManagerLookup 
hibernate.query.substitutions 把Hibernate查询中的一些短语替换为SQL短语(比如说短语可能是函数或者字符) . 
取值. hqlLiteral=SQL_LITERAL, hqlFunction=SQLFUNC 
hibernate.show_sql 把所有的SQL语句都输出到控制台(可以作为log功能的一个替代) 
取值. true | false 
hibernate.hbm2ddl.auto 自动输出schema创建DDL语句. 
取值. update | create | create-drop 
3.5.1. SQL Dialects SQL 方言
你总是可以为你的数据库设置一个hibernate.dialect方言,它是net.sf.hibernate.dialect.Dialect 的一个子类。如果你不需要使用基于native或者sequence的主键自动生成算法,或者悲观锁定(使用Session.lock() 或 Query.setLockMode())的话,方言就可以不必指定。然而,假若你指定了一个方言,Hibernate会为上面列出的一些属性使用特殊默认值,省得你手工指定它们。 
Table 3.4. Hibernate SQL 方言 (hibernate.dialect)
RDBMS 方言 
DB2 net.sf.hibernate.dialect.DB2Dialect 
MySQL net.sf.hibernate.dialect.MySQLDialect 
SAP DB net.sf.hibernate.dialect.SAPDBDialect 
Oracle (所有版本) 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 
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 
PostgreSQL net.sf.hibernate.dialect.PostgreSQLDialect 
HypersonicSQL net.sf.hibernate.dialect.HSQLDialect 
Microsoft SQL Server net.sf.hibernate.dialect.SybaseDialect 
Ingres net.sf.hibernate.dialect.IngresDialect 
Informix net.sf.hibernate.dialect.InformixDialect 
FrontBase net.sf.hibernate.dialect.FrontbaseDialect 
3.5.2. 外连接抓取(Outer Join Fetching )
如果你的数据库支持ANSI或者Oracle风格的外连接,外连接抓取可能提高性能,因为可以限制和数据库交互的数量(代价是数据库自身进行了更多的工作)。外连接抓取允许你在一个select语句中就可以得到一个由多对一或者一对一连接构成的对象图。 
默认情况下,抓取在叶对象,拥有代理的对象或者产生对自身的引用时终止。对一个特定关联来说,通过在XML映射文件中设置outer-join属性可以控制是否开启抓取功能。也可以设置hibernate.use_outer_join为false来全局关闭此功能。 你也可以通过hibernate.max_fetch_depth来设置抓取得对象图的最大深度。 
3.5.3. 二进制流
Oracle限制通过它的JDBC驱动传递的byte数组的大小。如果你希望使用很大数量的binary或者serializable 类型的话,你需要打开hibernate.jdbc.use_streams_for_binary。这只能通过JVM级别设定 
3.5.4. 在控制台记录SQL
hibernate.show_sql强制Hibernate把每一句SQL语句都写到控制台。这是作为打开log的一个简易替代。 
3.5.5. 自定义 ConnectionProvider
你可以自定义你的获取JDBC连接的策略,只需要实现net.sf.hibernate.connection.ConnectionProvider接口。在hibernate.connection.provider_class设置你自己的实现的类名。 
3.5.6. 常用数据库属性
几个配置属性影响除了DatasourceConnectionProvider之外的所有内置连接提供者.它们是: hibernate.connection.driver_class, hibernate.connection.url, hibernate.connection.username and hibernate.connection.password. 
hibernate.connection.isolation应该指定为一个整数值。(查阅java.sql.Connection可以得到值的含义,但注意大多数数据库不会支持所有的隔离级别。) 
专用的连接属性可以通过在"hibernate.connnection"后面加上属性名来指定。比如,你可以通过hibernate.connnection.charSet指定一个charSet。 
3.5.7. 自定义CacheProvider
通过实现net.sf.hibernate.cache.CacheProvider接口,你可以整合一个JVM级别(或者集群的)缓存进来。你可以通过hibernate.cache.provider_class选择某个子定义的实现。 

解决方案 »

  1.   


    3.5.8. 事务策略
    如果你希望使用Hibernate的Transaction API,你必须通过hibernate.transaction.factory_class属性指定一个Transaction实例的工厂类。 内置的两个标准选择是: net.sf.hibernate.transaction.JDBCTransactionFactory 
    使用数据库(JDBC)事务net.sf.hibernate.transaction.JTATransactionFactory 
    使用JTA(假若已经存在一个事务,Session会在这个上下文中工作,否则会启动一个新的事务。)
    你也可以自行定义你的事务策略(比如说,一个CORBA事务服务)。 如果你希望在JTA环境中为可变数据使用JVM级别的缓存,你必须指定一个获取JTA TransactionManager的策略。 Table 3.5. JTA TransactionManagers事务工厂类 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 3.5.9. 绑定SessionFactory到JNDI
    假若你希望把SessionFactory绑定到一个JNDI命名空间,用hibernate.session_factory_name这个属性指定一个名字(比如,java:comp/env/hibernate/SessionFactory)。如果这个属性省略了,SessionFactory不会被绑定到JNDI。(在一个只读的JNDI默认值实现的环境中,这特别有用。比如,Tomcat。) 当把SessionFactory 绑定到JNDI,Hibernate会使用hibernate.jndi.url,hibernate.jndi.class的值来获得一个初始化上下文的实例。如果他们没有指定,就会使用默认的InitialContext。 如果你选择使用JNDI,EJB或者其他工具类就可以通过JNDI查询得到SessionFactory。 3.5.10. 查询语言替换 
    你可以使用hibernate.query.substitutions定义新的Hibernate查询短语。比如说: hibernate.query.substitutions true=1, false=0
    会在生成的SQL中把短语true和 false替换成整数值。 hibernate.query.substitutions toLowercase=LOWER
    这可以让你重新命名SQL的LOWER函数。 3.6. XML配置文件
    另一种配置属性的方法是把所有的配置都放在一个名为hibernate.cfg.xml的文件中。这个文件应该放在你的CLASSPATH的根目录中。 <?xml version='1.0' encoding='utf-8'?>
    <!DOCTYPE hibernate-configuration PUBLIC
            "-//Hibernate/Hibernate Configuration DTD 2.0//EN" "http://hibernate.sourceforge.net/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="eg/Edge.hbm.xml"/>
            <mapping resource="eg/Vertex.hbm.xml"/>    </session-factory></hibernate-configuration>
    配置Hibernate只需如此简单: SessionFactory sf = new Configuration().configure().buildSessionFactory();
    你可以使用另外一个名字的配置文件: SessionFactory sf = new Configuration()
        .configure("catdb.cfg.xml")
        .buildSessionFactory();
    3.7. Logging
    通过Apache commons-logging,Hibernate记录很多事件。commons-logging服务会直接输出到Apache log4j(如果你把log4j.jar放在你的classpath里),或者JDK1.4 logging(如果你运行JDK 1.4或以上版本)。你可以从http://jakarta.apache.org下载log4j。要使用log4j,你需要在你的classpath中放置一个log4j.properties文件。Hibernate发行包中包含一个示例的properties配置文件。 我们强烈建议你熟悉Hibernate的log信息。Hibernate的很多工作都会尽量详细的留下log,也没有让它变的难以阅读。这是用来解决问题的最基本的设施。 3.8. NamingStrategy(命名策略)
    net.sf.hibernate.cfg.NamingStrategy接口允许你对数据库对象指定“命名标准”。你可以定义从Java标识符自动生成数据库标识符的规则,或者是映射文件中给出的“逻辑”字段名和表名处理为“物理”表名和字段名的规则。这个功能可以让映射文件变得简洁,消除无用的噪音(比如TBL_前缀等)。Hibernate使用的默认策略是几乎什么都不错。你可以在增加映射(add mappings)之前调用Configuration.setNamingStrategy()来指定不同的策略。 SessionFactory sf = new Configuration()
        .setNamingStrategy(ImprovedNamingStrategy.INSTANCE)
        .addFile("Vertex.hbm.xml")
        .addFile("Edge.hbm.xml")
        .buildSessionFactory();
    net.sf.hibernate.cfg.ImprovedNamingStrategy 是一个内置的策略,对某些程序,你可以把它作为改造的起点。 
      

  2.   

    更多内容请访问http://softtrade.vicp.netChapter 4. 持久化类(Persistent Classes)
    4.1. 简单示例
    大多数java程序需要一个持久化类的表示方法。 
    package eg;
    import java.util.Set;
    import java.util.Date;public class Cat {
        private Long id; // identifier
        private Date birthdate;
        private Cat mate;
        private Set kittens
        private Color color;
        private char sex;
        private float weight;    private void setId(Long id) {
            this.id=id;
        }
        public Long getId() {
            return id;
        }    void setMate(Cat mate) {
            this.mate = mate;
        }
        public Cat getMate() {
            return mate;
        }    void setBirthdate(Date date) {
            birthdate = date;
        }
        public Date getBirthdate() {
            return birthdate;
        }
        void setWeight(float weight) {
            this.weight = weight;
        }
        public float getWeight() {
            return weight;
        }    public Color getColor() {
            return color;
        }
        void setColor(Color color) {
            this.color = color;
        }
        void setKittens(Set kittens) {
            this.kittens = kittens;
        }
        public Set getKittens() {
            return kittens;
        }
        // addKitten not needed by Hibernate
        public void addKitten(Cat kitten) {
            kittens.add(kitten);
        }
        void setSex(char sex) {
            this.sex=sex;
        }
        public char getSex() {
            return sex;
        }
    }
    有三条主要的规则: 4.1.1. 为持久化字段声明访问器(accessors)和是否可变的标志(mutators)
    Cat为它的所有可持久化字段声明了访问方法。很多其他ORM工具直接对实例变量进行持久化。我们相信在持久化机制中不限定这种实现细节,感觉要好得多。Hibernate对JavaBeans风格的属性实行持久化,采用如下格式来辨认方法:getFoo, isFoo 和 setFoo。 属性不一定需要声明为public的。Hibernate可以对default,protected或者private的get/set方法对的属性一视同仁地执行持久化。 4.1.2. 实现一个默认的构造方法(constructor)
    Cat有一个显式的无参数默认构造方法。所有的持久化类都必须具有一个默认的构造方法(可以不是public的),这样的话Hibernate就可以使用Constructor.newInstance()来实例化它们。 4.1.3. 提供一个标识属性(identifier property)(可选) 
    Cat有一个属性叫做id。这个属性包含了数据库表中的主关键字字段。这个属性可以叫任何名字,其类型可以是任何的原始类型、原始类型的包装类型、java.lang.String 或者是 java.util.Date。(如果你的老式数据库表有联合主键,你甚至可以用一个用户自定义的类,其中每个属性都是这些类型之一。参见后面的关于联合标识符的章节。) 用于标识的属性是可选的。你可以不管它,让Hibernate内部来追踪对象的识别。当然,对于大多数应用程序来说,这是一个好的(也是很流行的)设计决定。 更进一步,一些功能只能对声明了标识属性的类起作用: 级联更新(Cascaded updates)(参阅“自管理生命周期的对象(Lifecycle Objects)”) Session.saveOrUpdate() 我们建议你对所有的持久化类采取同样的名字作为标识属性。更进一步,我们建议你使用一个可以为空(也就是说,不是原始类型)的类型。 4.1.4. 建议使用不是final的类 (可选)
    Hibernate的关键功能之一,代理(proxies),要求持久化类不是final的,或者是一个全部方法都是public的接口的具体实现。 你可以对一个final的,也没有实现接口的类执行持久化,但是不能对它们使用代理——多多少少会影响你进行性能优化的选择。 4.2. 继承(Inheritance )
    子类也必须遵守第一条和第二条规则。它从Cat继承了标识属性。 package eg;public class DomesticCat extends Cat {
            private String name;        public String getName() {
                    return name;
            }
            protected void setName(String name) {
                    this.name=name;
            }
    }更多内容请访问http://softtrade.vicp.net
      

  3.   

    需要更多hibernate资料的请到http://softtrade.vicp.net
      

  4.   

    狂倒..............兄弟...你好强,说明一下hibernate的论谈有完整的中文PDF下
      

  5.   

    hibernate中文网站,
    http://www.hibernate.org.cn/