博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CoreAPI_Update
阅读量:4357 次
发布时间:2019-06-07

本文共 2577 字,大约阅读时间需要 8 分钟。

讲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();     }

 

转载于:https://www.cnblogs.com/ligui989/p/3464633.html

你可能感兴趣的文章
为kubectl配置别名和命令行补齐
查看>>
解决在python中进行CGI编程时无法响应的问题
查看>>
记录一次MySQL数据库CPU负载异常高的问题
查看>>
python查看redis版本
查看>>
安装go环境
查看>>
安装kubernetes-dashboard
查看>>
从容器拷贝文件
查看>>
随笔-ansible-2
查看>>
腾讯云时间服务器
查看>>
nginx基础内容
查看>>
在CentOS 7上安装常用的YUM源
查看>>
getattr和setattr
查看>>
在CentOS6上安装mysql5.7报错
查看>>
cpu多级缓存
查看>>
使用VBA达到vlookup效果
查看>>
[已解决]报错run `npm audit fix` to fix them, or `npm audit` for details
查看>>
CUDA学习(六)之使用共享内存(shared memory)进行归约求和(M个包含N个线程的线程块)...
查看>>
CUDA学习(四)之使用全局内存进行归约求和(一个包含N个线程的线程块)
查看>>
CUDA学习(五)之使用共享内存(shared memory)进行归约求和(一个包含N个线程的线程块)...
查看>>
CUDA学习(七)之使用CUDA内置API计时
查看>>