- 基本开发步骤
- 开发持久化类(实体类),配置映射文件(即xxx.hbm.xml文件)或者直接利用持久化注解(hibernate基本上直接使用了JPA的标准注解)开发
- 加载hibernate配置文件,获取
configuration
对象 - 获取
SessionFactory
- 获取
Session
,打开事务
注:Session对象持有必选的一级缓存对象,在显示执行flush之前,所有的持久化操作数据都在缓存中的Session对象处 - 用面向对象的方式操作数据库
- 关闭事务,关闭
Session
//CRUD(增删改查示例)
Configuration conf = new Configuration().configure()
SessionFactory sf = conf.buildSessionFactory()
Session session = sf.openSession()
Transaction tx = session.beginTransaction()
User user_test = new User()
user_test.setUserName("vfva")
session.save(user_test)
tx.commit()
user_test = session.get(User.class,2)
System.out.println(user_test.getUserName())
user_test.setUserName("dahk")
session.update(user_test)
session.getTransaction().commit()
// session.delete(user_test)
- 随PO与Session的关联关系,PO的三种状态
- 瞬态:PO实例从未与Session关联过
- 持久化:PO实例与Session关联,且该实例对应到数据库记录
- 脱管:Session关闭,PO实例脱离了Session的管理
三种状态的转化关系图
- 三种状态的区别
1、 有没有ID,(如果没有则是Transient状态)
2、 ID在数据库中有没有
3、 在内存里有没有(session缓存) - 总结:
1、瞬时对象:随时可能被垃圾回收器回收(在数据库中没有于之对应的记录,应为是new初始化),而执行save()方法后,就变为Persistent对象(持久性对象),没有纳入session的管理内存中一个对象,没有ID,缓存中也没有
2、持久化对象:在数据库有存在的对应的记录,纳入session管理。在清理缓存(脏数据检查)的时候,会和数据库同步。
3、离线脱管对象:也可能被垃圾回收器回收掉(数据库中存在对应的记录,只是没有任何对象引用它是指session引用),注引状态经过Persistent状态,没有纳入session的管理