hibernate.cfg.xml常用配置
- hibernate.show_sql :是否把hibernate运行时的sql语句输出到控制台,便于编码阶段的测试
- hibernate.format_sql 输出到控制台的sql语句是否进行排版,便于阅读,一般设为true
- hbm2ddl.auto 帮助java代码生成数据库脚本,进而生成具体的表结构 (如果表存在,create:删除原来的表创建新表 update 在原表之上进行更新,create-drop先创建新表再删除原表 validate 如果与原来的表结构不同,不会创建新表)
- hibernate.default_schema 在创建的数据库前面加上前缀,比如:当标签之间填hibernate时,数据库名为hibernate.XXX
- hibernate.dialect 配置hibernate数据库方言,hibernate可针对不同的数据库进行优化。
session简介
解析:首先创建配置对象(configuration对象new Configuration().configure()还要有服务注册对象SeviceRegistry对象,new SeviceRegistryBuilder()…)来读去配置文档,获取配置对象后用它来创建sessionfactory对象,该对象会读取对象关系映射文件(XXX.hbm.xml),之后创建session对象,相当于JDBC中的connection,即操作数据库对象
执行session的方法,每次执行方法时要开启事物,执行完方法之后要提交事务,最后关闭session
重点内容
session不建议直接使用jdbc的connection操作数据库,而要通过session操作数据库
每个session对应一个connection,一个connection不同时刻供多个session使用。
调用session的方法,将对象保存在关系数据库中
- save()
- update()
- delete()
createQuery()
transaction简介
hibernate对数据库的操作是封装到事物当中,并且非自动提交,所以用session保存对象时,如果不开启事务,但却手工提交事务,对象并不会真正保存在数据库中。(表现为没有插入数据)jdbc自动提交事务,
如何获得session对象
- openSession方法
需要手动关闭,如果没有关闭多次之后导致连接池溢出。
每次创建新的session对象 - getCurrentSession方法
自动关闭,
使用现有的session对象(相当于单例模式)
需要在hibernate.cfg.xml中进行配置
本地事物(jdbc事务)
<property name="hibernate.current_session_context_class">thread</property>
全局事务(jta事务)
<property name="hibernate.current_session_context_class">jta</property>
小知识
可以用session的doWork方法,重写Work()来打印出connection.hashCode可以比较session是否为 同一个session对象。如果没有关闭session有多个hashcode(表示多个session将导致溢出)
session.doWork(new Work(){
public void execute(Connection connection) throws SQLException{
System.out.print(connection.hashCode())};
});
hbm配置文件常用设置
<class />
标签中的属性
name 映射的类名
table 映射的数据库中的表名
batch-size=‘n’ 一次抓取多少条记录
where=’condition’ 设置抓取记录的条件
entity-name=” 同一个类映射多个表
<id ></id>
id标签的属性有:
name映射的属性
type属性的类型
column 映射成数据库后子段的名称
length 映射成数据库后子段的长度
``
<generator class="generatorClass"