最近在使用Hibernate的时候发现一个问题,当我编写映射文件时,如果我在<class>中使用了dynamic-update=true时,它起到的作用是? 1)只修改改动过的字段 还是 2)只修改不为Null的字段 我在网上找到这两种不同的说法,但是经过我的反复测试,我觉得应该是答案应该是前者。但是问题也随之而来,虽然我能够修改改动过的字段,但是也只在某些特殊的情况下才行,比如说,我先session.load()然后再session.update(),加入这两个在同一个session中才行,不然它还是只会全部修改。但是我使用dynamic-update=true的初衷是希望它能够实现2的效果,所以说测试的结果令人失望。
我一直希望能够找到一种方法实现修改的时候自动忽略NULL字段,因为在我使用hbm配置文件配置其中的<many-to-one><one-to-one>的时候,这些字段很有可能是Null(外键关联为空时),而且如果这个字段在数据库中又是不能为空的,那么势必在update()的时候就要报错(无法将NULL插入XX字段),于是我还必须在update()之前先对这些外键经行判断,如果为空还要手动对它们进行赋初值操作,或者也可以在pojo的get方法中经行判断。的确这些变通的方法都可行,但是我任然感觉不爽,因为以前我一直都不用多对一标签没有这个问题,希望那位高手可以给我一些建议,小弟不胜感激。

解决方案 »

  1.   

    dynamic-update=true,意思是更新对象时,只更新修改过的那些字段.但是要使dynamic-update="true"生效,前提是该对象存在于缓存中(处于持久化状态).以下方法可供参考:
    1.调用session.load()方法加载该对象,修改相应字段.如:
    Session session = openSession();
    User user = (User)session.load(User.class,user.getId());
    user.setName("张三");
    session.flush();
    OK,自动更新,并且只更新那些修改过的字段.只不过这样会执行多一条SQL语句,导致性能下降??呵呵...
    直接传个id和修改某个字段后,hibernate是不会帮你自动更新那些修改过的字段的.它似乎还没达到那个智能的境界.
    2.写HQL,手动操作.直接,明了.呵呵..
    拿分.
      

  2.   

    关于不修改为null的字段的方法就是你在写映射文件的时候 对可能为null的属性不进行映射 那么在插入的时候数据库就会给复制为一个默认的不为空的值 而因为设置了一对多的主控关系 所以在更新的时候会把insert没插入的值更新为正确的值  不过这样会执行两条 SQL语句 性能下降 所以一般会使用双向关联 然后反转控制权