Hibernate的API一共有6个,分别为:Session、SessionFactory、Transaction、Query、Criteria和Configuration。
通过这些接口,可以对持久化对象进行存取、事务控制。 详情请百度.......
============================================================================================
Hibernate 4.0 版本
在CRUD操作执行完成后,释放资源阶段,如果仅仅是关闭session 进程无法停掉
还需要关闭会化工厂 SessionFactory.close()
还需要销毁 StandardServiceRegistry 实例 ssr
===> StandardServiceRegistryBuilder.destroy(ssr);
================================
1/提取出公共工具类:
-----------------------------------------------------------
public class HibernateSessionFactory {
private final static SessionFactory sessionFactory;
static {
try{
sessionFactory =new Configuration().configure().buildSessionFactory();
}catch (Exception e) {
e.printStackTrace();
throw new ExceptionInInitializerError(e);
}
}
public static Session getCurrentSession () {
return sessionFactory.getCurrentSession();
}
public static Session getOpenSession () {
return sessionFactory.openSession();
}
}
-----------------------------------------------------------
2/根据主键查询操作
a/ Object get(class , id ) 若数据不存在返回null
b/ Object load(class , id ) 若数据不存在返回ObjectNotFoundException
-----------------------------------------------------------
(一) Hibernate 动态更新
--> 这里记录基于API的三种方式进行简单的更新
1/ 使用update()方法
这个方法会直接进行跟新
2/ 使用load() 方法
-----------------------------------------------------
public void updataUser(User user) {
try {
transaction = HibernateSessionFactory.getCurrentSession().beginTransaction();
//加载获取数据库中存储的数据 保存为一个快照--> 缓存
User userToUpdate = userDao.loadUser(user.getId());
// 分别对每个属性进行赋值 --> 在快照的基础上进行比对,对发生变化的数据进行更新
userToUpdate.setAge(user.getAge());
userToUpdate.setName(user.getName());
userToUpdate.setPwd(user.getPwd());
transaction.commit();
}catch (Exception e){
e.printStackTrace();
if (transaction!=null){
System.out.println("异常回滚");
transaction.rollback();
}
}
}
-----------------------------------------------------
3/ 使用merge方法 动态更新 每次更新前都会进行查询 类同2, 但不用赋值
-----------------------------------------------------------
(二) 删除
-----------------------------------------------------------
1/ 常见异常处理:
not-null property references a null or transient value : com.bdqn.entity.User.age
---> 这个异常是因为:
<property name="age" column="age" type="java.lang.Integer" length="10" not-null="true"/>
==> hibernate 在进行数据封装时, 通过xml校验到 age属性是null的,而正如上面的
配置,notnull="true", 所以报错,但是在三层结构中,对于一般的数据
大部分都会在service和web层等做完校验,二者dao层应当校验完毕,
dao层处理的数据都应是一个有效数据.
notnull 使用需适当
2/ 如果主键增长策略是assign 则在执行删除的时候, Hibernate会先进行查询主键是否有效,是否会返回
一个正确有效的对象,然后进行删除
-----------------------------------------------------------
删除的两种API方式 : 1 / 通过传入一个id数据 , 然后调用load/get方法获取一个对象
调用delete方法删除对象
2 / 通过传入的id封装为一个只含有id属性的对象,直接调用delete方法删除,但
此方法使用需要结合xml配置里的非空验证
-----------------------------------------------------------
-----------------------------------------------------------
( 三 ) 三种状态
----------------------------------------------
状态 内存 session
瞬时态 × ×
游离态 √ ×
持久态 √ √
----------------------------------------------
脏对象: 执行完查询或者其他某个操作 , 将游离态对象转变成了持久态,最初的时候 Hibernate会给
拿到的数据一个快照,在接下来使用过程中很有可能对当前这个对象会做出一些修改,导致数据
发生变化,一旦发生变化,这个对象就被成为了脏对象.
=========== > 在hibernate中状态前后发生改变的对象,称为脏对象
脏检查; 一旦数据发生变化,Hibernate就回进行脏检查,一旦发现脏对象,就回执行同步操作,保持和数据库
数据一致
===> 脏检查触发的时机 :
a/ 事务提交 tx.commit() 时触发
b/ 刷新缓存 tx.flush() 时触发
========================================================================================