package com.hc.entity;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.query.Query;
public class Cache {
public static void main(String[] args) {
// TODO Auto-generated method stub
SessionFactory factory = new Configuration().configure().buildSessionFactory();
Session session = factory.openSession();
Transaction transaction = session.beginTransaction();
// 一级
// 一级 二级 不缓存集合 再次查找 不发送sql
// User user=session.load(User.class, 1);//get 由session管理 生命周期与session相同
// System.out.println(user.getUserId()+"---"+user.getUserName());
// User user1=session.load(User.class, 1);
// System.out.println(user1.getUserId()+"---"+user1.getUserName());
// 二级需手动导入依赖、配置
// 开启二级缓存
// 指定工厂类
// 指定实体类使用 SessionFactory
// User user = session.load(User.class, 1);
// System.out.println(user.getUserId() + "---" + user.getUserName());
// session.close();
// session = factory.openSession();
User进入二级缓存后 加载的数据被缓存 二级工厂不关闭 则数据一直存在
第二次加载一样的数据 则不会发送sql 而是提取内存中旧数据
// User user1 = session.load(User.class, 1);
// System.out.println(user1.getUserId() + "---" + user1.getUserName());
// 查询缓存 缓存数据库表主键id 只缓存集合 不能缓存对象
// 开启查询缓存
// Query query = session.createQuery("from User");
// query.setCacheable(true);// 不设置 则非查询缓存
// List<User> users = query.list();
// for (User user : users) {
// System.out.println(user.getUserId() + "---" + user.getUserName());
// }
// session.close();
// session = factory.openSession();
// // 查询缓存集合 再次查询不会再发送请求
// //关闭二级缓存后 再次加载 n+1问题 发送的sql条数是list.size 且是根据id查询
// Query query1 = session.createQuery("from User");
// query1.setCacheable(true);// 不设置 则会重新加载
// List<User> users1 = query1.list();
// for (User user : users1) {
// System.out.println(user.getUserId() + "---" + user.getUserName());
// }
// Query query1 = session.createQuery("select a.userName from User a");
// query1.setCacheable(true);
// List<String> users1 = query1.list();
// for (String user : users1) {
// System.out.println(user);
// }
// session.close();
// session = factory.openSession();
// Query query = session.createQuery("select a.userName from User a");
// query.setCacheable(true);
// List<String> users = query.list();
// for (String user : users) {
// System.out.println(user);
// }
// transaction.commit();//多余 在调用session.close()的时候,该函数就已经将 trans.commit()执行
session.close();
factory.close();
}
}