• 关于hibernate的,另外一些应用!


    ---恢复内容开始---

    首先在在原来的搭建的基础上,建上一个测试类,其中的目的就是实现一些简单的增删改查,好的,现在我来代码贴上!对了,其中的测试类,就是junit这个的创建就不需要多说了!

      

        public void testSave2() {
            Configuration cfg = new Configuration().configure();//读取配置文件
            SessionFactory sf = cfg.buildSessionFactory();//建立工厂的sessionfactory其中的配置文件中有
            Session session = sf.openSession();// 找到其中的session并且打开
            Transaction ts = session.getTransaction();//数据库事务声明
            try {
                ts.begin();
                
                User user = new User();
                user.setUsername("daijianwei");//这一段是主要的数据库的操作的
                user.setPassword("woaini");
                session.save(user);
                
                ts.commit();
            } catch (HibernateException e) {
                ts.rollback();//假如上面的的数据操作没有操作成功,就需要事物的回滚,不然的会会报异常!
            }finally{
                session.close();
            }
        }

    通过执行上面的操作,就可以在原来创建的表中插入一条数据,其中的注释,我也写上来,主要要注意的是回滚事物,意思就是在没有操作成功的时候,进行事物的回滚!
      在这里,要进行说明一下,如果你在配置文件中有一条这样的语句,Hbm2dd.cuto 其中的代码,我贴上来,<property name="hbm2ddl.auto">update</property>

    这句话表示的意思就是只有的更新的时候,才会对表进行操作,而不是你每次执行一次操作,就创建一张表,这是 需要特别注意的地方,如果你需要每次都执行一次,就创建一张表的话,把update换成create就行了。

      上面的代码,是有重复性的,我每次进行操作的时候只要读取一次配置文件就行了,所有上面的 Configuration 和 SessionFactory可以进行封装的操作,也就是建立一个工具类!,工具类的代码,我也写好了,贴上代码来看看。

    package com.daijianwei.util;
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.cfg.Configuration;
    
    public class HibernateUtil {
        private static Configuration cfg;//定义成私有的,并且也是static的
        private static SessionFactory sf;//定义成私有的,也是static的
        
        private HibernateUtil(){}//私有的构造方法
        static{
            cfg = new Configuration().configure();
            sf = cfg.buildSessionFactory();//初始化成员变量
        }
        
        public static Session getSession(){
            return sf.getCurrentSession(); //提供拿到session的方法
            
        }
    }

    对了,这里我用的sf.getCurrentSession()这个方法,这里也就需要解释一下吧,就比如,农行有农行的系统,工行有工行的系统,两者的系统时不同的,但是要实现转账的时候,中间要用的连接是不是两者都共同有的,现在,我在测试类的中的session和在工具类中的session是不同的,所以,我就需要拿到相同的session,可以很方便进行操作,也就是JTA管理远程事物,也就是我们现在所说的sf.getCurrentSession()这个方法,使用这个方法要注意的2点,第一点,我们使用的sf.getCurrentSession()在工具类,而在测试类中,我们是不能关闭的session的。第二点,在配置文件中,我们也需要对sf.getCurrentSession()这个方法进行配置,配置的语句代码,我也贴出来。很简单一句<property name="current_session_context_class">thread</property>

    以上的两点就是需要注意的地方!

      接下来,就是在测试类当中的具体应用了,测试类中应用,贴上代码可以看一下!

      

    public void testSave() {
            Session session = null;
            Transaction ts = null;
            try {
                session = HibernateUtil.getSession();//拿到session
                ts = session.getTransaction();//建立数据库的事物
                ts.begin();
                /*User user = new User();
                user.setUsername("jack5");
                user.setId(1);
                user.setPassword("123");
                session.save(user);*/
                User u1 = (User) session.load(User.class, 2);//通过方法拿到当前的id为2的对象
                
                session.evict(u1);
                System.out.println(u1.getUsername());//通过拿到的对象来进行一系列的操作
                ts.commit();
                
            } catch (Exception e) {
                
                    ts.rollback();
                
            }
            
        }
        

    在这里需要注意的几个地方,通过拿到的id为的对象那个方法,一个是session.get()和session.load();两个方法,两个方法有一些很大的不同。其中在get方法中方法执行的时候,会马上发出sql语句,从而得出真实的对象。而load()方法使用了lazy(懒加载,或者叫做延迟加载)机制,当执行的时候,不会发生sql语句,得到代理对象只是在使用的时候,才会发生sql语句。为什么要有这两个方法,其中在load方法中,有一个明显的好处就是;利用了懒加载的,可以明显的减少服务器的压力!因为有些用户,他的请求可能是在一半的时候就会终止掉,这个时候,就没有必要接着往下执行了,如果你还接着往下执行,就照成服务器的资源浪费的问题了。。所以就很没有必要!

      接下来,来看看hibernate当中一些瞬时,持久化,和离线当中的三者,关系,这里还是来看看其中的一张图,。这张图就很好的说明其中的关系

     图中的三个属性,一个瞬时属性,瞬时属性就是通过对象来new 出来的,数据库没有,session没有。代码我也贴出来!

    package com.daijianwei.Test2;
    
    import org.hibernate.HibernateException;
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.Transaction;
    import org.hibernate.cfg.Configuration;
    import org.junit.Test;
    import com.daijianwei.po.User;
    import com.daijianwei.util.HibernateUtil;
    
    public class HiberTest {
    
        @Test
        public void testSave() {
            Session session = null;
            Transaction ts = null;
            try {
                session = HibernateUtil.getSession();//拿到session
                ts = session.getTransaction();//建立数据库的事物
                ts.begin();
                User user = new User();
                user.setUsername("jack5");
                user.setId(1);
                user.setPassword("123");
                session.save(user);
                /*User u1 = (User) session.load(User.class, 2);//通过方法拿到当前的id为2的对象
                
                session.evict(u1);
                System.out.println(u1.getUsername());//通过拿到的对象来进行一系列的操作
    */            ts.commit();
                
            } catch (Exception e) {
                
                    ts.rollback();
                
            }
            
        }
        
        
        @Test
        public void testSave2() {
            Configuration cfg = new Configuration().configure();//读取配置文件
            SessionFactory sf = cfg.buildSessionFactory();//建立工厂的sessionfactory其中的配置文件中有
            Session session = sf.openSession();// 找到其中的session并且打开
            Transaction ts = session.getTransaction();//数据库事务声明
            try {
                ts.begin();
                
                User user = new User();
                user.setUsername("daijianwei");//这一段是主要的数据库的操作的
                user.setPassword("woaini");
                session.save(user);
                
                ts.commit();
            } catch (HibernateException e) {
                ts.rollback();//假如上面的的数据操作没有操作成功,就需要事物的回滚,不然的会会报异常!
            }finally{
                session.close();
            }
        }
        
    }

    其中上面的就是通过new出来的瞬时对象,瞬时对象通过save方法,就会变成持久化对象,,所以也可以简单的理解,在hibernate当中也就没有简单的数据库的增删改查的概念,就是几种对象的转换,
      了解瞬时对象,接下来,我们来看看持久化对象,最明显的一个特点,就是在数据库和session中都有,所以他是和session和数据库同步的,你就可以对他进行一些修改的操作,。并且操作的结果都是和数据库当中同步的,我也把代码贴出来看看,

    User u1 = (User) session.load(User.class, 2);//通过方法拿到当前的id为2的对象
                
                session.evict(u1);
                System.out.println(u1.getUsername());//通过拿到的对象来进行一系列的操作

    在hibernate当中,全部都是对象的感念,都是拿到id为几的对象,
      了解了持久化对象,接下来,我们来看看离线对象,离线对象,就是在session没有了,在数据库中还有着,。我也做一个例子来看看这个离线对象,请看代码

    User u1 = (User) session.load(User.class, 2);//通过方法拿到当前的id为2的对象
                
                session.close();
                System.out.println(u1.getUsername());

    这样的操作是没有用的,程序是肯定会报错的,因为在session当中已经关闭了,就不可能在对这个对象进行任何的操作了,对了,是通过close这个方法进行转换的,另外离线对象通过update方法可以转换成持久化对象,其中的关系,图中也有了详细的信息,,多看一下图,也可以多尝试的做几个例子,。就可以熟能生巧了~!

      

  • 相关阅读:
    Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column 'kindergarten.n.stuMChkTime' which is not functionally dependent on columns in GROUP BY clause; this is in
    ajax上传图片报错TypeError: 'append' called on an object that does not implement interface Fo
    Error:(1, 1) java: 非法字符: 'ufeff'
    SSM项目启动报错WEB-INFlibjavax.servlet-api-4.0.1.jar)
    SSH项目中使用struts-tags报错According to TLD or attribute directive in tag file, attribute test does not accept any expressions
    java查询数据库数据时报错antlr/ANTLRException
    [React Testing] Mock HTTP Requests with jest.mock in React Component Tests
    [React ARIA Testing] Test Accessibility of Rendered React Components with jest-axe
    [React Testing] Assert That Something is NOT Rendered with React Testing Library (with rerender & query)
    [React Testing] Improve Test Confidence with the User Event Module
  • 原文地址:https://www.cnblogs.com/daijianwei/p/3131349.html
Copyright © 2020-2023  润新知