Hibernate的核心配置信息
属性名 |
用途 |
数值 |
hibernate.connection.driver_class |
设置数据库的驱动类 |
驱动类名 |
hibernate.connection.url |
设置连接数据库的URL |
URL |
hibernate.connection.username |
设置连接数据库的用户名 |
用户名 |
hibernate.connection.password |
设置连接数据库的密码 |
密码 |
hibernate.connection.pool_size |
设置连接池的最大容量 |
一个整数 |
hibernate.connection.datasource |
设置数据源的JNDI名字 |
JNDI名 |
hibernate.dialect |
针对不同的数据库提供的方言类,允许Hibernate针对特定的数据库生成优化的SQL语句 |
方言类名 |
hibernate.show_sql |
是否输出Hibernate操作数据库使用的SQL语句 |
true或者false(默认) |
hibernate.format_sql |
是否格式化输出的SQL语句 |
true或者false(默认) |
hibernate.connection.isolation |
设置JDBC事务隔离级别,不是所有的数据库都支持所有的隔离级别 |
取值为1(默认)、2、3或者4, |
hibernate.connection.auotocommit |
设置是否启用数据库事务的自动提交 |
true或者false(默认) |
hibernate.max_fetch_depth |
为单向关联的一对一和多对一的外连接抓取(outer join fetch)设置最大深度,数值为0将关闭默认的外连接抓取 |
建议数值为0~3 |
hibernate.default_batch_fetch_size |
设置关联的批量抓取数量 |
建议取值为4、8或16 |
hibernate.default_entity_mode |
指定默认的持久化实体表现形式 |
dynamic-map、pojo(默认)或dom4j, |
续表
属性名 |
用途 |
数值 |
hibernate.default_entity_mode |
指定默认的持久化实体表现形式 |
dynamic-map、pojo(默认)或dom4j, |
hibernate.order_updates |
强制Hibernate按照被更新数据的主键,为SQL更新排序,可以减少在高并发系统中事务的死锁几率 |
true或者false(默认) |
hibernate.generate_statistics |
是否激活收集性能调节的统计数据 |
true或者false(默认) |
hibernate.use_sql_comments |
是否生成有助于调试的注释信息 |
true或者false,(默认) |
在MS SQLServer及Oracle等数据库中可以在Hibernate配置文件中设置属性hibernate.jdbc.batch_size来控制达到多少数据后送至数据库处理。如果在插入或者删除大量记录时使用这个属性,可以提高系统的性能。具体设置参考下面的代码:
- <property name="hibernate.jdbc.batch_size">100</property>
MySQL数据库不支持这个功能。
数据库方言类
Hibernate可以连接不同的数据库,但是需要使用不同的数据库方言类。这是因为多数关系数据库都支持标准的SQL,均有各自的SQL方言,hibernate.dialect属性用于指定被访问数据库使用的方言类(DB Dialect Class)。当Hibernate生成SQL查询语句,或者使用native作为标识符属性生成策略时都会参考数据库的方言类。表2 2所示不同数据库对应的方言类。
数据库 |
方言类 |
DB2 |
org.hibernate.dialect.DB2Dialect |
HypersonicSQL |
org.hibernate.dialect.HSQLDialect |
Informix |
org.hibernate.dialect.InformixDialect |
Interbase |
org.hibernate.dialect.InterbaseDialect |
Pointbase |
org.hibernate.dialect.PointbaseDialect |
PostgreSQL |
org.hibernate.dialect.PostgreSQLDialect |
Microsoft SQL Server |
org.hibernate.dialect.SQLServerDialect |
MySQL |
org.hibernate.dialect.MySQLDialect |
Oracle 9i/10g/11g |
org.hibernate.dialect.Oracle9iDialect |
Oracle 9i/10g/11g |
org.hibernate.dialect.Oracle9iDialect |
FrontBase |
org.hibernate.dialect.FrontbaseDialect |
SAP DB |
org.hibernate.dialect.SAPDBDialect |
Sybase |
org.hibernate.dialect.SybaseDialect |
Sybase Anywhere |
org.hibernate.dialect.SybaseAnywhereDialect |
Transaction接口
Transaction接口是对实际事务实现的一个抽象,这些实现包括JDBC事务或者JTA等。这样设计允许开发人员能够使用一个统一的事务操作接口使得自己的项目可以在不同的环境和容器(Container)之间方便地迁移。
Hibernate中的事务是通过配置hibernate.cfg.xml文件选择使用JDBC或者是JTA事务控制。参考下面的配置内容:
- <property name="transaction.factory_class">
- org.hibernate.transaction.JDBCTransactionFactory
- </property>
上面的配置内容表示Hibernate中的事务使用JDBC的事务控制,使用JTA事务控制的配置内容如下:
- <property name="transaction.factory_class">
- org.hibernate.transaction.JTATransactionFactory
- </property>
如果hibernate.cfg.xml文件中没有针事务的配置,则默认使用JDBC的事务控制Hibernate中的事务。
在Transaction接口中主要定义了commit()和rollback()两个方法,前者是提交事务的方法;后者是回滚事务的方法。
Query接口
使用Query类型的对象可以方便查询数据库的数据,它使用QBC、QBE、HQL或者原生SQL(Native SQL) 查询数据。Query对象不仅能查询数据,还可以绑定参数、限制查询记录数量,以及批量删除和批量更新等。使用Query对象的示例代码如下:
- Configuration config = new Configuration().configure();
- SessionFactory sessionFactory = config.buildSessionFactory();
- Session session = sessionFactory.getCurrentSession();
- Transaction tx = session.beginTransaction();
- Query query = session.createQuery("from Guestbook");
- List list = query.list();
- tx.commit();
上面代码表示Query对象通过Session对象的createQuery()方法创建,其中的方法参数值"from Guestbook"是HQL语句,表示要读取所有Guestbook类型的对象。即读取Guestbook表中的所有记录,把每条记录封装成Guestbook对象后保存到List对象中并返回List对象。
Query对象只在Session对象关闭之前有效,否则就会抛出SessionException类型的违例。因为Session对象就像JDBC中的Connection对象,表示与数据库的一次连接。关闭Connection对象,Statement对象则不能使用。所以关闭Session对象,也就不能使用Query对象。参考下面示例的错误代码:
- Configuration config = new Configuration().configure();
- SessionFactory sessionFactory = config.buildSessionFactory();
- Session session = sessionFactory.getCurrentSession();
- Transaction tx = session.beginTransaction();
- Query query = session.createQuery("from Guestbook");
- List list = query.list();
- tx.commit();
- query.list();//此行会抛出org.hibernate.SessionException