zoukankan      html  css  js  c++  java
  • CoreAPI_Update

    讲update不是讲这个方法,而是讲什么时候会更新数据库里面的内容。

    什么情况下用更新?
    1.可以更新一个detachd状态对象,把它变成persistent,同时数据库里进行更新
    2.更新transient状态的对象会报错,但是更新自己设定好的ID的transient对象可以(前提是数据库里有对应的这条数据记录)

    有一个问题,它会将所有字段都进行更新,效率不高。是否可以做到只更新改过的字段呢?有三种方法
    1.修改注解,在model里面加@Column( updatable=false)。这种方式不好,因为它不灵活
    2.在xml配置文件上写一个dynamic-update="true",则可以只更新改了的字段。但是如果跨session,则又会更新所有字段,因为上一个session关闭了,这个session没有比较的东西。如果使用了mergo,相当于从数据库里面查了一次,又有了比较的对象,又会只更新改过的字段。在annotation里面,dynamic-update没有这个对应的设置。
    3.在实际开发中,可以直接使用HQL语句。
    建议使用第三种,但是如果觉得所有字段都更新,这个效率接受得了,就可以不这么费力。


    如果一个对象是persistent状态,只要设定不同字段,就会发生更新,如果跟原来的值相同,那么它就不会发出update

    /**
         * 可以更新一个detachd状态对象,把它变成persistent,同时数据库里进行更新
         */
        @Test
        public void testUpdate1() {
            
            Session session = sf.getCurrentSession();
            session.beginTransaction();
            Teacher t = (Teacher)session.get(Teacher.class,1); 
            session.getTransaction().commit(); 
            
            t.setName("zhanglaoshi");
            
            Session session2 = sf.getCurrentSession();
            session2.beginTransaction();
            session2.update(t); 
            session2.getTransaction().commit();
        }
        
        /**
         * 更新transient状态的对象会报错
         */
        @Test
        public void testUpdate2() {
            
            Teacher t = new Teacher();
            t.setName("zhanglaoshi");
            
            Session session2 = sf.getCurrentSession();
            session2.beginTransaction();
            session2.getTransaction().commit();
        }
        
        /**
         * 但是更新自己设定好的ID的transient对象可以(前提是数据库里有对应的这条数据记录)
         */
        @Test
        public void testUpdate3() {
            
            Teacher t = new Teacher();
            t.setId(1);
            t.setName("zhanglaoshi");
            
            Session session2 = sf.getCurrentSession();
            session2.beginTransaction();
            session2.update(t); 
            session2.getTransaction().commit();
        }
        
        @Test
        public void testUpdate4() {
            
            Session session = sf.getCurrentSession();
            session.beginTransaction();
            Teacher t = (Teacher)session.get(Teacher.class,1); // get完之后是persistent状态
            t.setName("zhanglaoshi"); // 这里会发出一条sql语句,原因是我们改了它的name了
            
            /* session在提交的时候会检查一下,缓存与数据库之间的同步,
            如果跟原来的值不同则会发出update,update的时候所有字段都会更新,相同则不会*/
            session.getTransaction().commit(); 
        }
        
        /**
         * 在实际开发中,可以直接使用HQL语句。
         */
        @Test
        public void testUpdate5() {
            
            Session session = sf.getCurrentSession();
            session.beginTransaction();
            Query q = session.createQuery("update Teacher t set t.name='fdf' where t.id = 1");
            q.executeUpdate();
            session.getTransaction().commit(); 
        }
  • 相关阅读:
    python sendmail
    linux find命令
    10块钱去买酒,2块一瓶,2空瓶换一瓶,4盖换一瓶,问能喝到什么时候
    【转】通过经纬度坐标计算距离的方法(经纬度距离计算)
    Android应用开发相关下载资源(2015/3/20更新)
    使用Entity Framework访问MySQL数据库
    VS2013+EF6.1+Mysql配置心路历程
    SQL-LINQ-Lambda语法对照实例
    百度统计今晚更新了,统计的数据报表格式都大变样了,少不了我的功劳吧!跟类似yoyooho.com的小伙伴说再见啦
    跟踪那些像www.yoyooho.com非友链带来的百度统计数据解析【第三篇】
  • 原文地址:https://www.cnblogs.com/ligui989/p/3464633.html
Copyright © 2011-2022 走看看