天天看点

Hibernate进阶知识点必备

hibernate.show_sql:是否把Hibernate运行时的SQL语句输出到控制台,编码阶段便于测试,为true的好

-hibernate.format_sql:输出到控制台的SQL语句是否进行排版,便于阅读。建议设置为true。它好我也好嘛。

hbm2ddl.auto:可以帮助由java代码生成数据库脚本,进而生成具具体的表结构。create | update | create_drop | validate

create: 每次都会创建一个新的表结构(慎用)

update: 更新变化的部分,会维持原有的测试数据的存在

create_drop: 如果有就删掉再重新生成(慎用)

validate: 验证表结构有无冲突,有冲突则不进行操作

hibernate.default_schema: 默认的数据库。在创建数据库表结构的时候会加上此前缀

hibernate.dialect:配置Hibernate数据库的方言,Hibernate可以针对特殊的数据库进行优化!

先看一下,hibernate的执行流程吧。

首先是Configuration(hibernate.cfg.xml)

然后是SessionFactory(Beans.hbm.xml):创建和销毁都相当的耗费资源,通常一个系统内一个数据库只创建一个这样的对象

Session: 相当于传统的JDBC中的Connection(但是session与connection是多对一的关系。开发的时候尽量不要使用connection):

-开启一个事务(Transaction)

利用session进行CRUD操作

事务提交(transaction。commit())

关闭会话(session.close())

关闭sessionFactory(如果需要的话,一般不需要)

如何获取session对象:

openSession的方式:针对的是sessionFactory而言。

getCurrentSession的方式():需要在hibernate.cfg.xml中实现对name为hibernate.current_session_context_class的属性的配置。值为thread代表本地事务。jta 代表全局事务。

这二者的区别:后者事务提交或者回滚后悔自动的关闭,前者需要手动的关闭;后者使用的是单例模式,即只是对同一个底层的session的操作,前者则是每次创建一个新的session进行操作。

Hibernate对数据库的操作都是封装在事务中的,并且默认是非自动提交的方式。所以,用Session保存对象时,如果不开启事务,并且手动的提交事务,对象并不会真正的保存到数据库中。

但是如果你想让Hibernate像JDBC那样自动的提交事务,必须调用session的对象的doWork()方法,获得JDBC的connection后,设置其为自动提交事务模式。

通常来说,不建议采用自动提交的方式。因为要实现session的doWork方法,里面是一个匿名的类,。