封装方法获取session
public class HibernateUitl {
private static SessionFactory sessionFactory ;
static {
//读文件
Configuration configuration=new Configuration().configure();
sessionFactory = configuration.buildSessionFactory();
}
//获取一个全新的session
public static Session getOpenSession() {
return sessionFactory.openSession();
}
//获取当前使用的session
//注意:使用该方法 必须在主配置文件中配置一下
public static Session getCurrentSession() {
return sessionFactory.getCurrentSession();
}
}
主键分类
主键的规则:不能重复 不能修改
1.自然主键
表里面 有一个字段 符合主键的规则
就直接使用这个字段 作为主键
2.代理主键
表里面 没有一个字段 符合主键的规则
自己创建id 作为表的主键 这个键就叫代理主键
主键生成策略 7种
identity
主键自增 使用数据库当中的主键自增
插入时 打印的sql语句中不会插入id
increment
主键自增 有hibernate管理
插入数据时u 会先去数据库中查询当前的最大id 然后把查出来的id+1 插入数据
uuid
全球不重复的唯一标识32位字符串
注意:id必须使用字符串类型
native(最常用)
identity+sequence+hilo
根据你使用的数据库来选择使用下面的三个策略之一
所有数据库不是支持identity 就支持sequence
hilo(高低位)
将主键交给hibernate处理 使用自己的算法 帮你维护主键
assigned
由你自己维护主键 插入数据时需要有主键
使用的代理主键
sequence 序列 oracle数据库默认的
hibernate数据库配置
设置数据库的隔离级别
(etc/hibernate.properties文件)
默认隔离级别 4 (1 2 4 8)
#hibernate.connection.isolation 4
1.脏读
2.不可重复读
3.幻读
隔离级别:
读未提交 READ_UNCOMMITTED 1 2 3
读已提交 READ_COMMITTED 2 3
可重复读 REPEATABLE READ 3
串行化 Serilizable 都能避免
<property name="hibernate.connection.isolation">4</property>
hibernate 操作对象的三种状态
1.瞬时态 没有id 没有跟session产生关系
2.持久态 有id 有跟session产生关系
3.游离态 有id ,没有跟session产生关系
public class Demo01 {
@Test
public void fun1() {
Session session=HibernateUitl.getOpenSession();
Transaction transaction=session.beginTransaction();
User user=new User(); //瞬时态
user.setUsername("wanglong");
session.save(user); //持久态
transaction.commit();
session.close(); //游离态
}
缓存(读写时速度快 效率高)
硬盘(读写文件速度慢)
当你调用get方法区数据库查询时
数据库给你返回结果集 会被hibernate封装成对象
并且保存在缓存当中一份
当你再次get方法查询时 hibernate会先到缓存中查找有没有该id的对象
有就直接返回 缓存中的对象 没有就用sql去操作数据库查询
@Test
public void fun3() {
Session session=HibernateUitl.getOpenSession();
Transaction transaction=session.beginTransaction();
// 总结:hibernate会在你提交事务之后 把持久态的对象同步到数据库
// 使用get方法查询一个对象
User user1 = session.get(User.class, 2);
User user2 = session.get(User.class, 2);
User user3 = session.get(User.class, 2);
User user4 = session.get(User.class, 2);
User user5 = session.get(User.class, 2);
//打印几条sql语句 为什么
System.out.println(user2==user5);
transaction.commit();
session.close();
}
快照
get方法查询时
hibernate会把结果集保存到缓存中一份 快照中一份
当最终提交事务操作数据库的时候
hibernate会对比缓存与快照的数据
一样就不存了 反之会同步到数据库
@Test
public void fun4() {
Session session=HibernateUitl.getOpenSession();
Transaction transaction=session.beginTransaction();
User user = session.get(User.class, 2);
user.setUsername("aa");
user.setUsername("bb");
session.update(user);
//打印几条sql语句
transaction.commit();
session.close();
}
//测试 new对象 -> 瞬时态 -> 游离态->持久态
@Test
public void fun5() {
Session session=HibernateUitl.getOpenSession();
Transaction transaction=session.beginTransaction();
User user=new User();
user.setId(2);
user.setPassword("111");
session.update(user);
//update方法
//hibernate会把该对象 保存到缓存中
session.get(User.class, 2);
transaction.commit();
session.close();
}
}