一、创建Configuration对象
Configuration实例的唯一作用是创建SessionFactory实例;若映射定义文件在类加载路径中,则可用addResource()方法来添加映射定义文件
3种配置Hibernate方式:
使用hibernate.properties作为配置文件(\project\etc\hibernate.properties)
Configuration cfg = new Configuration(); // 多次调用addResource方法,添加映射文件 cfg.addResource(“Item.hbm.xml”); cfg.addResource(“Bid.hbm.xml”);
因为映射文件和持久化类往往是一一对应的,可通过向Configuration对象添加持久化类让Hibernate自己搜索映射文件(在这种方式下,所有的映射文件应放在持久化类文件相同的包路径下)
Configuration cfg = new Configuration(); // 多次调用addClass方法,直接添加持久化类 cog.addClass(“lee.Item.class”); cog.addClass(“lee.Bid.class”);
使用hibernate.cfg.xml作为配置文件(\project\etc\hibernate.cfg.xml)
Configuration cfg = new Configuration(); // 加载hibernate.cfg.xml cfg.configure();
不使用配置文件直接创建Configuration实例
Configuration对象提供了如下三个方法:
Configuration addResource(String resourceName):为Configuration对象添加一个映射文件
Configuration setProperties(Properties properties):为Configuration对象设置一系列属性,这系列属性通过Propertiest实例传入
Configuration setProperty(String propertyName,String value):为Configuration对象设置一个单独的属性
public class NewsManager{ public static void main(String[] args) throws Exception{ Configuration conf = new Configuration() .addClass(org.app.News.class) .setProperty(“hibernate.connection.url”,”jdbc:mysql://localhost/hibernate”) .setProperty(“hibernate.connection.username”,”root”) .setProperty(“hibernate.connection.password”,”123”) .setProperty(“hibernate.connection.c3p0.max_size”,”20”) .setProperty(“hibernate.connection.c3p0.min_size”,”1”) .setProperty(“hibernate.connection.c3p0.timeout”,”5000”) .setProperty(“hibernate.connection.c3p0.max_statements”,”100”) .setProperty(“hibernate.connection.c3p0.idle_test_period”,”3000”) .setProperty(“hibernate.connection.c3p0.acquire_increment”,”2”) .setProperty(“hibernate.connection.c3p0.validate”,”true”) .setProperty(“hibernate.connection.dialect”,”org.hibernate.dialect.MySQLInnoDBDialect”) .setProperty(“hibernate.hbm2ddl.auto”,”create”); SessionFactory sf = conf.buildSessionFactory(); Session sess = sf.openSession(); Transaction tx = sess.beginTransaction(); News n = new News(); n.setTitle(“title”); n.setContent(“content”); sess.save(n); ct.commit(); sess.close(); } }
二、JDBC连接属性
所有Hibernate属性的名字和语义都在org.hibernate.cfg.Environment中定义
<!—连接数据库--> <!—设置连接数据库的驱动 --> <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property> <!—设置所需连接数据库服务的URL --> <property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property> <!—连接数据库的用户名 --> <property name="connection.username">system</property> <!—连接数据库的密码 --> <property name="connection.password">123</property> <!— 使用C3PO连接池 --> <!—连接池的最大连接数 --> <property name="hibernate.c3po.max_size">20</property> <!—连接池的最小连接数 --> <property name="hibernate.c3po.min_size">1</property> <!—连接池中连接的超时时长 --> <property name=" hibernate.c3po.timeout ">5000</property> <!--连接池最大缓存多少个Statement对象--> <property name=" hibernate.c3po.max_statements ">100</property> <property name=" hibernate.c3po.idle_test_period ">3000</property> <property name=" hibernate.c3po.acquire_increment ">2</property> <property name=" hibernate.c3po.validate ">true</property>
三、数据库方言
告诉Hibernate应用程序的底层即将使用哪种数据库
<propertyname="dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
DB2 org.hibernate.dialect.DB2Dialect
DB2 AS/400 org.hibernate.dialect.DB2400Dialect
DB2 OS3090 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 org.hibernate.dialect.Oracle9iDialect
Oracle 10g org.hibernate.dialect.Oracle10gDialect
Sybase org.hibernate.dialect.SybaseDialect
Sybase Anywhere org.hibernate.dialect.SybaseAnywhereDialect
Mircriosoft 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.PregressDialect
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
四、JNDI数据源的链接属性
若无须Hibernate自己管理数据源,而是直接访问容器管理数据源,Hibernate可使用JNDI(JavaNaming Diretory Interface,Java命名目录接口)数据源的相关配置;
下面是连接JNDI数据源的主要配置属性:
hibernate.connection.datasource:指定数据源JNDI名字 hibernate.jndi.url:指定JNDI提供者的URL(可选),若JNDI与Hibernate持久化访问的代码处于用一个应用中,则无须指定该属性 hibernate.jndi.class:指定JNDI InitialContextFactory的实现类(可选), 若JNDI与Hibernate持久化访问的代码处于用一个应用中,则无须指定该属性 hibernate.connection.username:指定连接数据库的用户名(可选) hibernate.connection.password:指定连接数据库的密码(可选)
配置Hibernate;连接Tomcat中数据源的配置片段:
<property name=”connection.datasource”>java:comp/env/jdbc/dstest</property> <property name=”dialect”>org.hibernate.dialect.MySQLDialect</property>
五、Hibernate事物属性
Hibenate不仅提供了局部事物支持,也允许使用容器管理的全局事物
hibernate.transaction.factory_class:指定Hibernate所用的事物工厂的类型(属性值必须是TransactionFactory的直接或间接子类)
jta.UserTransaction:属性值是一个JNDI名。Hibernate将使用JTATransactionFactory从应用服务器获取JTA UserTransaction
hibernate.transaction.manager_lookup_class:属性值应为一个TransactionManagerLookup类名,当使用JVM级别的缓存时,或在JTA环境中使用hilo生成器策略时,需该类
hibernate.transaction.flush_before_completion:指定Session是否在事物完成后自动将数据刷新到底层数据库
hibernate.transaction.auto_close_session:指定是否在事物结束后自动关闭Session
六、二级缓存相关属性
Hibernate的SessionFactory可持有一个可选的二级缓存,通过使用这种二级缓存可提高Hibernate的持久化访问的性能
hibernate.cache.provider_class:设置二级缓存CacheProvider的类名
hibernate.cache.use_minimal_puts:以频繁的读操作为代价,优化二级缓存以实现最小化写操作;该设置对集群缓存非常有用,对集群缓存的实现默认开启
hibernate.cache.use_query_cache:设置是否允许查询缓存;个别查询仍然需显示设置为可缓存的
hibernate.cache.use_second_level_cache:用于设置是否启用二级缓存;该属性可完全禁止使用二级缓存;对那些在映射文件中指定了<cache…/>的持久化类,则默认开启二级缓存
hibernate.cache.query_cache_factory:设置查询缓存工厂的类名(默认StandardQueryCache),查询缓存工厂必须实现QueryCache接口;
hibernate.cache.region_prefix:设置二级缓存区名称的前缀
hibernate.cache.use_structured_entries:设置是否强制Hibernate以可读性更好的格式将数据存入二级缓存
七、外连接抓取属性
外连接抓取能限制SQL语句的次数来提高效率,这种外连接抓取通过在单个select语句中使用outer join来一次抓取多个数据表的数据
外连接抓取允许在单个select语句中,通过<many-to-one…/>、<one-to-many…/>、<many-to-many…/>和<one-to-one…/>等关联获取连接对象的整个对象图
将hibernate.max.fetch_depth设为0,将在全局范围内禁止外连接抓取,设为1或更高值能启用N-1或1-1的外连接抓取;除此之外,还应在映射文件中通过fetch=”join”来指定这种外连接抓取
八、其他常用配置属性
hibernate.show_sql:是否在控制台输出Hibernate生成的SQL语句(true、false)
hibernate.format_sql:是否将SQL语句转成格式良好的SQL(true、false)
hibernate.use_sql_comments:是否在Hibernate生成的SQL语句中添加有助于调试的注释(true、false)
hibernate.jdbc.fetch.size:指定JDBC抓取数量的大小(整数),其实质是调用Statement.setFetcheSize()方法
hibernate.jdbc.batch.size:指定Hibernate使用JDBC2的批量更新的大小(整数),建议取5-30
hibernate.connection.autocommit:设置是否自动提交(通常不建议打开)
hibernate.hbm2ddl.auto:设置当创建SessionFactory时,是否根据映射文件自动建立数据库表,create-drop:显示关闭SessionFactory时,将Drop刚建的数据表;(update、create、create-drop)