hibernate02

封装方法获取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();
	}
}







展开阅读全文

没有更多推荐了,返回首页