hibernate5学习知识点小结

1、SessionFactory

//加载主配置文件
Configuration config=new Configuration().configure();
//创建Session工厂
SessionFactory sessionFactory=config.buildSessionFactory();

是由Configuration对象通过buildSessionFactory()方法创建的。是一个重量级对象(系统开销大)、单例的、线程安全的。一般不需要手动关闭,应用结束时自动将其销毁。
目的:

//获取Session
Session session=sessionFactory.getCurrentSession();

2、Session 轻量级对象、线程不安全、多例的。使用原则:一个事务一个对象,用完关闭。
两种获取方式:

Session session=sessionFactory.openSession(); 每调用一次方法获取一个新的Session对象。必须手动关闭session对象,无需环境注册,查询可以不在事务中。

Session session=sessionFactory.getCurrentSession(); 获得当前线程中Session对象。自动关闭session对象,无需手动关闭。需要配置运行环境。操作(CURD)必须在事务中进行。

3、Transaction 由Session对象创建 session.getTransaction()

事务的开启:session.getTransaction().begin(); 或者 session.beginTransaction();

事务的提交:session.getTransaction().commit();

事务的回滚:session.getTransaction().rollback();
 4、CURD操作

@Test
    public void mytest() {
        Session session = CommonUtil.getSession();
        session.getTransaction().begin();
        // 执行操作
        Student student = new Student("王五", 21, 100);
        session.save(student);
        session.getTransaction().commit();
    }

    @Test
    public void persistTest() {
        Session session = CommonUtil.getSession();
        session.getTransaction().begin();
        // 执行操作
        Student student = new Student("照六", 21, 100);
        session.persist(student);
        session.getTransaction().commit();
    }

    @Test
    public void deleteTest() {
        Session session = CommonUtil.getSession();
        session.getTransaction().begin();
        Student student = new Student();
        student.setId(2);
        session.delete(student);
        session.getTransaction().commit();
    }

    @Test
    public void updateTest() {
        Session session = CommonUtil.getSession();
        session.getTransaction().begin();
        Student student = new Student("李四", 27, 89);
        student.setId(4);
        session.update(student);
        session.getTransaction().commit();
    }

    @Test
    public void getTest() {
        Session session = CommonUtil.getSession();
        session.getTransaction().begin();
        Student student = session.get(Student.class, 20);
        System.out.print(student);
        session.getTransaction().commit();
    }
    
    @Test
    public void loadTest() {
        Session session = CommonUtil.getSession();
        session.getTransaction().begin();
        Student student = session.load(Student.class, 20);
        System.out.print(student);
        session.getTransaction().commit();
    }

}

对于get()和load()方法的区别:

  get():若id对应的数据不存在,不报错,返回null
       load():若id对应的数据不存在,抛出异常

5、同一事务中:增、删、改执行的顺序:

@Test
    public void sortTest(){
        Session session = CommonUtil.getSession();
        session.beginTransaction();
        
        try {
            //删除
            Student student1=new Student();
            student1.setId(2);
            session.delete(student1);
            
            //修改
            Student student2= new Student("小七",19,96);
            student2.setId(3);
            session.update(student2);
            
            //增加    
            Student student3= new Student("老八",23,98);
            session.save(student3);
            
            session.getTransaction().commit();
        } catch (Exception e) {
            session.getTransaction().rollback();
            e.printStackTrace();
        }
        
    }

执行结果是:
由此可见:在同一个Session中执行顺序默认是增,改,删

调整顺序的方法:在操作之后加上 session.flush();

@Test
    public void saveOrUpdate(){
        Session session = CommonUtil.getSessionFactory().openSession();
        session.beginTransaction();
        Student student= new Student("小五",19,96);
      //有ID设置,则更新 student.setId(
3); session.saveOrUpdate(student); //无ID设置,则登录 Student student2= new Student("小五",19,96); session.saveOrUpdate(student2); session.getTransaction().commit(); }
原文地址:https://www.cnblogs.com/huadiyatou/p/7515248.html