• Hibernate ORM框架——项目一:Hibernate事务的生命周期,不建议使用openSession而改造


    数据库

    use demo;
    
    select * from CLASSINFO;
    select * from persons;
    
    delete from CLASSINFO;
    delete from persons;
    
    insert into CLASSINFO values('c111','banji1');
    insert into CLASSINFO values('c222','banji2');
    
    
    insert into persons values('p1','p111','c111')
    insert into persons values('p2','p222','c111')
    insert into persons values('p3','p333','c222')
    insert into persons values('p4','p444','c222')
    insert into persons values('p5','p555',null)
    
    select pid,name from persons order by pid desc;--降序
    select pid,name from persons order by pid asc;--升序
    
    
    select COUNT(*),name from persons group by name
    
    select (select pid,name from persons),p.rci from persons p left join CLASSINFO c on p.rci=c.cid group by p.rci;

    使用双向一对多多对一的案例

    实体人,班级不变;实体映射文件不变;配置文件不变

    班级dao包

    package dao;
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.Transaction;
    
    import shuang.m2oo2m.ClassInfo;
    import util.HibernateUtil;
    
    public class ClassInfoDao {
        /*public void insert(){
            SessionFactory sf = HibernateUtil.getSessionFactory();
            Session s = sf.openSession();
            Transaction tx = s.beginTransaction();
            
            ClassInfo ci = new ClassInfo();
            ci.setCid("xxx");
            ci.setName("xxxx");
            
            s.save(ci);
            
            tx.commit();
            s.close();
            
        }*/
        
        
        /*public void insert(Session s,Transaction tx){
            SessionFactory sf = HibernateUtil.getSessionFactory();
            //Session s = sf.openSession();
            //Transaction tx = s.beginTransaction();
            
            ClassInfo ci = new ClassInfo();
            ci.setCid("xxx");
            ci.setName("xxxx");
            
            s.save(ci);
            
        //    tx.commit();
            //s.close();
            
        }*/
        
        //4.
        public void insert(){
            
            Session s = HibernateUtil
                    .getSessionFactory()
                    .getCurrentSession();
            System.out.println("第二次调用getCurrentSession" + s.hashCode());
            ClassInfo ci = new ClassInfo();
            ci.setCid("xxx");
            ci.setName("xxxx");
            
            s.save(ci);
            
        
            
        }
    }

    人dao包

    package dao;
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.Transaction;
    
    import shuang.m2oo2m.*;
    import util.HibernateUtil;
    
    public class PersonDao {
        
        /*
         * 1.往person表里面添加一条记录
         */
        /*public void insert(){
            SessionFactory sf = HibernateUtil.getSessionFactory();
            Session s = sf.openSession();
            Transaction tx = s.beginTransaction();
            
            Person p = new Person();
            p.setPid("p6");
            p.setName("xxx");
            
            s.save(p);
            
            tx.commit();
            s.close();
            
        }*/
        
        
        //2.
        /*public void insert(Session s){
            SessionFactory sf = HibernateUtil.getSessionFactory();
            
            Transaction tx = s.beginTransaction();
            
            Person p = new Person();
            p.setPid("p6");
            p.setName("xxx");
            
            s.save(p);
            
            tx.commit();
            //s.close();
            
        }*/
        
        //3
        /*public void insert(Session s,Transaction tx){
            SessionFactory sf = HibernateUtil.getSessionFactory();
            
            //Transaction tx = s.beginTransaction();
            
            Person p = new Person();
            p.setPid("p6");
            p.setName("xxx");
            
            s.save(p);
            
            //tx.commit();
            //s.close();
            
        }*/
        
        //4.
        public void insert(){
            Session s = HibernateUtil
                    .getSessionFactory()
                    .getCurrentSession();
            
            System.out.println("第1111次调用getCurrentSession" + s.hashCode());
            Person p = new Person();
            p.setPid("p6");
            p.setName("xxx");
            
            s.save(p);
            
        }
    }

    业务

    package service;
    
    
    
    import dao.ClassInfoDao;
    import dao.PersonDao;
    import util.HibernateUtil;
    
    public class ClassPersonService {
        /*
         * 这个方法的作用是用来
         * 同时插入一个人和一个班级信息
         */
        private PersonDao pdao= new PersonDao();
        private ClassInfoDao cdao = new ClassInfoDao();
        
        
        public void insert(){
            //1.第一次,用来表明为什么session
            //要从service类里传到dao里
            
            //初始的时候,每一个dao的方法都有自己的session与事务对象
            //也就是每个方法都是独立的
            
            //每次一个业务,对应多个dao对象的多个方法或者
            //一个dao对象的多个方法,都打开了多个session(关联了jdbc connection)
            //这样是资源浪费
            
            //同时也导致是不同的事务
            
            /*pdao.insert();
            cdao.insert();*/
            
            //2.第二次改造
            //这次的改造是让多个方法用同一个session
            //解决了多session(意味着多个jdbc connection)的
            //资源浪费问题
            
            //但是仍然存在不同同一个事务里面的问题
            /*Session s = HibernateUtil.getSessionFactory().openSession();
            pdao.insert(s);
            cdao.insert(s);
            s.close();*/
            
            //3.下面的这次改造就是同一个session,同一个事物。
            //解决了session的资源浪费问题以及多个不同事务的问题
            
        /*    Session s = HibernateUtil.getSessionFactory().openSession();
            Transaction tx = s.beginTransaction();
            pdao.insert(s,tx);
            cdao.insert(s,tx);
            tx.commit();
            s.close();*/
            
            //4.
        /*    Session s = HibernateUtil.getSessionFactory().getCurrentSession();
            Transaction tx = s.getTransaction();
            pdao.insert();
            cdao.insert();
            tx.commit();*/
            
            
        /*    Session s = HibernateUtil.getSessionFactory().getCurrentSession();
            s.getTransaction().begin();//创建一个事务
            pdao.insert();
            cdao.insert();
            s.getTransaction().commit();
            */
    
            HibernateUtil.getSessionFactory()
            .getCurrentSession()
            .getTransaction()
            .begin();//创建一个事务
            
            pdao.insert();
            cdao.insert();
            
            HibernateUtil.getSessionFactory()
            .getCurrentSession()
            .getTransaction()
            .commit();//当事务提交时,此事务关联的session会自动帮你关闭
            
            /*与此服务类的代理类配合使用
             * pdao.insert();
            cdao.insert();*/
        }
    }

    Main测试

    package com.nf;
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.Transaction;
    
    import service.ClassPersonService;
    import util.HibernateUtil;
    
    public class Main {
    
        public static void main(String[] args) {
            
            ClassPersonService service = new ClassPersonService();
            service.insert();
        }
    
        private static void template() {
            SessionFactory sf = HibernateUtil.getSessionFactory();
            Session s = sf.openSession();
            Transaction tx = s.beginTransaction();
    
            tx.commit();
            s.close();
            sf.close();
        }
    
    }

    使用代理改进版

    前面不变,业务变

    package service;
    
    import util.HibernateUtil;
    
    public class ClassPersonServiceProxy extends ClassPersonService {
    
        public void insert() {
            HibernateUtil.getSessionFactory()
            .getCurrentSession()
            .getTransaction()
            .begin();//创建一个事务
            
            super.insert();
            
            HibernateUtil.getSessionFactory()
            .getCurrentSession()
            .getTransaction()
            .commit();
        }
    }

    Main测试变

    package com.nf;
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.Transaction;
    
    import service.ClassPersonServiceProxy;
    import util.HibernateUtil;
    
    public class Main {
    
        public static void main(String[] args) {
    
            ClassPersonServiceProxy service = new ClassPersonServiceProxy();  
            service.insert();
        }
    
        private static void template() {
            SessionFactory sf = HibernateUtil.getSessionFactory();
            Session s = sf.openSession();
            Transaction tx = s.beginTransaction();
    
            tx.commit();
            s.close();
            sf.close();
        }
    
    }
  • 相关阅读:
    网络芯片应用:GPS公交车行驶记录仪
    “黑暗潜伏者” -- 手机病毒新型攻击方式
    Android导入工程提示Invalid project description
    设计模式_代理模式
    el简略说明与11个隐含对象
    jsp九大内置对象
    js全局函数
    python基础:multiprocessing的使用
    pgAdmin III 使用图解
    windows下简单安装postgres
  • 原文地址:https://www.cnblogs.com/Sunny-lby/p/7445968.html
Copyright © 2020-2023  润新知