hibernate的加载策略及可能出现的问题
重点:
- 对象的三种状态(hibernate管理的对象);
- 一级缓存、快照(orm特性);
- 加载策略;
- 并发控制;
- 在写代码中出现的错误解决;
重点解析:
- 对象的三种状态(hibernate管理的对象)
1.1 临时状态
1.2 持久状态
1.3 游离状态
总结:
1、hibernate通过管理对象来操作数据库,这里对象指的是持久态的对象
2、各种状态的对象是可以相互转换
代码分析
Configuration configure = new Configuration().configure("hibernate.cfg.xml");
SessionFactory sessionFactory = configure.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
User user = new User();
user.setId(6);
user.setUserPwd("134674");
//将临时状态改变为持久状态
session.save(user);
User u = session.get(User.class, user.getId());
//将持久状态转换我临时状态
session.delete(u);
u.setUserName("胡玥婷");
//将状态转换成游离状态
session.close();
transaction.commit();
2.一级缓存、快照(orm特性)
2.1 、
简介:一级缓存又称我session级别的缓存
- 1、 相当于数据库中的某一条数据在hibernate中产生一个快照,并且将至封装进对象
- 2、user 如果说发生了改变,那么它会与之间的hibernate中的快照进行对比,如果说不一致,那么就会修改数据库中的数据
u = {1 ww 20 2018-5-3 abcd} --> u = {1 qq 17 null xyz}
u’ = {1 ww 20 2018-5-3 abcd}
代码分析
Configuration configure = new Configuration().configure("hibernate.cfg.xml");
SessionFactory sessionFactory = configure.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
//获取一个快照
User u = session.get(User.class, 5);
//获取之前的数据与之对比,进行分析
System.out.println(u.getUserName());//徐玉溪
u.setUserName("郑文昔");
System.out.println(u.getUserName());//郑文昔
transaction.commit();
session.close();
- 加载策略
3.1 立即加载
代码分析
public User getUser(User user) {
SessionFactory sessionFactory = configure.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
User u = session.get(User.class,user.getId());
transaction.commit();
session.close();
return u;
}
3.2 延迟加载
代理对象
存单 LazyInitializationException
代码分析:
public User loadUser(User user) {
SessionFactory sessionFactory = configure.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
User u = session.load(User.class,user.getId());
transaction.commit();
session.close();
return u;
}
在代码测试会出现错误
错误1:
org.hibernate.LazyInitializationException: could not initialize proxy [com.zking.one.entity.User#5] - no Session
解决:org.Hibernate.lazyinitializationException:无法初始化代理[com.zking.one.tiy.user
这是一个懒加载的问题,将查询的oid(Object id)保存到session的代理proxy中,
当要真正用到查询的对象的时候,在去执行查询sql语句。
- 并发控制 version
错误2:
Error during managed flush [Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect) : [com.zking.two.entity.Student#24]]
解决:在托管刷新期间发生错误[行被另一个事务更新或删除(或未保存的值映射不正确)