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() 时触发 ========================================================================================