hibernate加载策略
-
对象的三种状态(hibernate管理的对象)
1.1 临时状态
1.2 持久状态
1.3 游离状态
1、hibernate是通过管理对象来操作数据,这里对象指的是持久化对象。
2、hibernate中的三种状态的对象是可以相互转换的,通常编码时只关注持久
化对象。关注get、save、update方法所操作后的对象 -
一级缓存、快照(orm特性)
u = {1 ww 20 2018-5-3 abcd} --> u = {1 qq 17 null xyz}u’ = {1 ww 20 2018-5-3 abcd}
package com.zking.three.test;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import com.zking.one.entity.User;
/**
*讲解一级缓存、快照
*所谓一级缓存其实就是session级别的缓存(优点:性能提高)
*1、用户第一次访问数据库,拿到第一条数据,再将数据形成一个快照保存到session会话中,并且利用反射机制将值封装到实体类中
* 3 呱呱 123 2018-10-17 15:52:08
*User user=Class.forName("com.zking.one.entity.User").newinsetense;
*user.setUname(...);.....
*2、当封装好的持久化对象里面的属性值发生改变是,它会与session中快照进行对比,如果不一致,那么会进行修改更新
*/
public class Demo3 {
public static void main(String[] args) {
Configuration cfg=new Configuration().configure("hibernate.cfg.xml");
SessionFactory sessionFactory = cfg.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
User user = session.get(User.class, 3);
System.out.println(user.getRealName());
user.setRealName("呱呱");
transaction.commit();
session.close();
}
}
一级缓存讲解
3. 加载策略
3.1 立即加载
3.2 延迟加载
代理对象
存单
LazyInitializationException
单例模式
饱汉模式
饿汉模式/懒汉模式
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.SessionFactoryUtils;
public class UserDao {
// 立即加载(输出顺序:123,sql,456<不管有没有调用都会执行>)
public User getUser(User user) {
Session session=SessionFactoryUtils.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();
session.close();
return u;
}
//懒加载(输出顺序:123,456,sql<只有调用了才会执行>)
public User loadUser(User user) {
Session session=SessionFactoryUtils.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());
transaction.commit();
session.close();
return u;
}
4. 并发控制
version
update t_student set sname=‘zs1’, version=version+1
where sid = 8 and version=0
并发现象:
public void updateStudent(Student student) {
Session session=SessionFactoryUtils.getSession();
Transaction transaction = session.beginTransaction();
session.update(student);
transaction.commit();
session.close();
}
test
@Test
public void testUpdateStudent() {
Student student=new Student();
student.setSid(6);
student.setSname("冬瓜");
student.setVersion(2);
this.userDao.updateStudent(student);
}
/**
* 不用hibernate处理并发现象:加versionqq字段,在sql语句中加上versionqq=versionqq+1;
*/