hibernate定义
hibernate是一种框架,一种开源的关系对象映射框架,它对JDBC做了
轻量级的封装,可以让使用者直接通过操纵POJO对象,来完成对数据库的操作。hibernate会自动生成sql语句,并执行。
hibernate配置文件
hibernate框架使用中,是直接对POJO对象*进行操作,来达到增删改查数据库的目的。
pojo对象的配置
pojo实体类:
>
public class Dept {
private Integer id;
private String name;
//set,get,以及无参构造
}
/>
Dept:类名对应数据库的表名dept
id :字段,dept表主键
name:字段
Dept配置文件:
<hibernate-mapping>
<class name="jopo.Dept" table="Dept" catalog="test">
<id name="id" type="java.lang.Integer">
<column name="id" not-null="true" />
<generator class="increment"/>
</id>
<property name="name" type="java.lang.String">
<column name="name" length="20" />
</property>
</class>
</hibernate-mapping>
1. < class >标签表示一个实体类,在其中配置实体类的属性
name ="类的权限定名" table="表名" catalog="数据库名"
< id >标签设置主键, name="属性名",type="类型"
< column > 设置字段:name="字段名" not-null ="true" 非空
< generator >设置主键生成策略: 不同的数据库,也有不同
native 根据数据库自适应
2.< property > 属性:
name 属性名,type 类型
< column > 设置字段:name="字段名" not-null ="true" 非空
length 长度
property 标签可简写
< property name="name" column="name" />
配置文件处理
配置文件管理
Configuration
作用:进行配置信息的管理
目标:用来生成SessionFactory
可以在configure()中指定hibernate的配置文件,如果不指定,则在src/classpath下加载hibernate.cfg.xml文件
—加载默认hibernate的配置文件
sessionFactory = new Configuration().configuration().buildSessionFactory();
—加载指定的hibernate配置文件
sessionFactory = new Configuration().configuration("文件").buildSessionFactory();
SessionFactory
生产session的工厂,
生成一个session,sessionFactory从连接池取出一个连接交给session
对jopo类的操作,都是依赖于session进行的
getSession()
Session
Session是管理数据库的一个任务单元
新建一个session可以理解为要开启一个对数据库操作的任务(个人理解,求斧正)
通过load/get可以从数据库获得pojo对象 load/get(POJO类.class,主键标识)
get,直接从数据库中查到并获取了对象信息
load,本人理解为预加载,已经定位了需要的信息,只等临门一脚(真正使用时),才会把对象信息加载到jopo对象中返回。
通过save(pojo),将一个pojo对象加入到session中,没有save操作,不会对数据库进行修改
update(pojo),更新指定主键的字段信息,在xml中<property>有一个update属性,默认为true,可以更新,如果设为false,不可更新。
flush(),将session中的数据刷新到数据库中,如果没有flush,则根本不会对数据库进行操作。flush也有多种默认(详解自己看)。
比如:
|FlushMode.ALWAYS:任务一条SQL语句,都会flush一次
|FlushMode.NEVER :永远不flush 此选项在性能优化时可能用,比如session取数据为只读时用,这样就
不需要与数据库同步了
除了flush外,还有evict,clear。
evict(pojo)是从session中拆除,如果实在flush之前拆除,则在提交事务
即session.getTransaction().commit()时会异常。不同步(具体原因涉及到session的内部结构了,本人也不太清楚,大概是因为entityEntries在flush注册信息与本身保存的不一致的原意,entityEntries是个map集合)。
Transaction
开启事务(增、删、改的时候是先将jopo保存在session中,如果没有flush(),则根本不会对数据库进行操作),和sql中的开启事务,提交事务/回滚一致。
commit以session中的信息来flush更新数据库
roolback方法session中的信息失效,不更新数据库