先来说说主键生成策略 有下面几种:
1、程序员自己控制主键的生成 assigned
2、数据库控制 identify、sequence
3、hibernate进行控制 increment、uuid/uuid.hex
4、跨数据库的 native=identify+sequence
5、自定义 实现接口完成
1. 对象的三种状态(hibernate管理的对象)
1.1 临时状态
1.2 持久状态
1.3 游离状态
1、hibernate是通过管理对象来操作数据,这里对象指的是持久化对象。
2、hibernate中的三种状态的对象是可以相互转换的,通常编码时只关注持久
化对象。关注get、save、update方法所操作后的对象
//用get是持久态对象 持久态对象才能操作数据库
User user2 = openSession.get(User.class, 3);//查询单个的名字
//关闭后就变成游离对象
openSession.close();
openSession=sessions.openSession();
//当前是游离对象
user2.setRealname("哈哈哈");
openSession.update(user2);
//更新后持久对象
user2.setRealname("哈哈哈1");
openSession.delete(user2);
//临时对象
user2.setRealname("哈哈哈2");
openSession.save(user2);
//添加之后变成持久态对象
user2.setRealname("哈哈哈3");
//System.out.println(user2.getRsername());输出名字
2.一级缓存:
**
* 一级缓存:
* 又被称为session级别的缓存
* session.get执行的时候 将查询出来的对象形成快照保存到内存
* openSession.update(user2);
* 就是将user实例对象跟jvm中的快照进行对比 当不一致的时候会进行更新
* @param args
*/
3. 加载策略
3.1 立即加载
3.2 延迟加载 代理对象
LazyInitializationException
单例模式
饱汉模式
饿汉模式/懒汉模式
//根据id查询dao方法 get
public Student get(Integer sid) {
Session getsession = SessionFactoryUtil.getsession();
Transaction beginTransaction = getsession.beginTransaction();
Student student=getsession.get(Student.class,sid);
beginTransaction.commit();
getsession.close();
return student;
}
//load
public Student load(Integer sid) {
Session getsession = SessionFactoryUtil.getsession();
Transaction beginTransaction = getsession.beginTransaction();
Student student=getsession.load(Student.class,sid);
beginTransaction.commit();
getsession.close();
return student;
}
测试里面:
/**
* get和load方法的区别:
* get是立即加载 获取的是具体的类对象
* load是懒加载 获取到的是hibernate根据实体类创建的代理对象 是用来保存实体类对象的oid
* oid是hibernate用来标识实体类的唯一性
* get是查询好放到内存里面可拿到
* load是用就给你查询 不要用就存一个id
*/
@Test
public void testGet() {
Student student=studentdao.get(1);
System.out.println(student.getSid());//id
System.out.println(student.getSname());//名字
System.out.println(student.getClass().getName());//类名
}
@Test
public void testLoad() {
Student student=studentdao.load(1);
System.out.println(student.getSid());//id 这个只能获取到id
System.out.println(student.getSname());//名字
System.out.println(student.getClass().getName());//类名
}