1. 对象的三种状态(hibernate管理的对象)
1.1 临时状态 (new delete)
1.2 持久状态(get save update)
1.3 游离状态 (close)
注意: 1、hibernate通过管理对象来操作数据库,这里对象指的是持久态的对
象
2、各种状态的对象是可以相互转换
2. 一级缓存、快照(orm特性:对象 关系 映射)对象改变数据就改变
一级缓存讲解
-
1.一级缓存又称为session级别的缓存 ,相当于数据库中的某一条数据在hibernate中产生一个快照(保存当时状态),并且将值封装进对象
-
2.对象如果发生了改变,那么它会与之前的hibernate中的快照进行对比(不是与数据库中数据对比),如果不一致,那么将会修改数据库中的数据.
3. 加载策略
3.1 立即加载 get 是立即加载
3.2 延迟加载
load是懒加载(延时加载)
* 什么是懒加载?
将查询的oid(object id(用来标识唯一的对象))保存到session的代理proxy 中,当要真正的用到查询的对象的时候,再去执行查询的sql语句
*
*/
package com.zking.three.dao;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.zking.one.entity.User;
import com.zking.two.entity.Student;
import com.zking.two.util.SessionFactoryUtil;
public class UserDao {
/**
* get 是立即加载
* @param user
* @return
*/
public User getUser(User user) {
Session session = SessionFactoryUtil.getSession();
Transaction transaction = session.beginTransaction();
System.out.println(123);
User u=session.get(User.class, user.getId());
System.out.println(456);
System.out.println(u.getUserName());
transaction.commit();
SessionFactoryUtil.closeSession();
return u;
// 123 sql语句 456 张翊晗
}
/**load是懒加载(延时加载)
*
* could not initialize proxy(代理) -因为 no Session
* 懒加载问题:(性能更优)
* 什么是懒加载?
* 将查询的oid(object id(用来标识唯一的对象))保存到session的代理proxy 中,当要真正的用到查询的对象的时候,再去执行查询的sql语句
*
*/
public User loadUser(User user) {
Session session = SessionFactoryUtil.getSession();
Transaction transaction = session.beginTransaction();
System.out.println(123);
User u=session.load(User.class, user.getId());
System.out.println(456);
System.out.println(u.getUserName());//要用查询的对象了 , 返回去调sql语句
transaction.commit();
SessionFactoryUtil.closeSession();
return u;
// 123 456 sql语句 张翊晗
}
}
测试
*
4. 并发控制
在表中追加一个用于版本控制的字段version , 该字段会伴随着每次修改而改变, 假如同时有两个线程修改数据库, 则第二个修改的那个线程一定会发现数据库中的版本发生了改变, 此时就会抛异常, 程序就可以捕捉到该异常, 从而使其再次发出请求, 而用户是不会感知到的.
实体类
映射文件
注意: 此时version标签一定要在property标签之前
测试
/**
* 并发控制
*/
@Test
public void testUpdateStudent() {
Student student=new Student();
student.setSid(2);
student.setVersion(1);//bb
student.setSname("bbbcc");
this.userDao.updateStudent(student);//bbbb //修改id=2,vession=1 (sname=bb) 的sname=bbbb 修改后 sname=bbbb version+1 =2;
//修改后 再次执行此方法修改不了 因为vsersion=2了.
}