问题:设置了dynamic-update, 可是事实上并没有按照期望进行了update。

案例代码如下:

1、持久化对象

  1. package com.jdw.hibernate.entities;
  2.  
  3. import java.util.Date;
  4.  
  5. public class News {
  6. private Integer id;
  7. private String title;
  8. private String author;
  9. private Date date;
  10.  
  11. public News() {
  12. // TODO Auto-generated constructor stub
  13. }
  14.  
  15. public News(String title, String author, Date date) {
  16. super();
  17. this.title = title;
  18. this.author = author;
  19. this.date = date;
  20. }
  21.  
  22. @Override
  23. public String toString() {
  24. return "News [id=" + id + ", title=" + title + ", author=" + author
  25. + ", date=" + date + "]";
  26. }
  27.  
  28. public Integer getId() {
  29. return id;
  30. }
  31.  
  32. public void setId(Integer id) {
  33. this.id = id;
  34. }
  35.  
  36. public String getTitle() {
  37. return title;
  38. }
  39.  
  40. public void setTitle(String title) {
  41. this.title = title;
  42. }
  43.  
  44. public String getAuthor() {
  45. return author;
  46. }
  47.  
  48. public void setAuthor(String author) {
  49. this.author = author;
  50. }
  51.  
  52. public Date getDate() {
  53. return date;
  54. }
  55.  
  56. public void setDate(Date date) {
  57. this.date = date;
  58. }
  59. }

2、hbm.xml

  1. <?xml version="1.0"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  3. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  4. <!-- Generated 2016-3-8 20:08:39 by Hibernate Tools 3.4.0.CR1 -->
  5. <hibernate-mapping>
  6. <class name="com.jdw.hibernate.entities.News" table="NEWS" lazy="false" select-before-update="true" dynamic-update="true">
  7. <id name="id" type="java.lang.Integer" unsaved-value="110">
  8. <column name="ID" />
  9. <generator class="native" />
  10. </id>
  11. <property name="title" type="java.lang.String">
  12. <column name="TITLE" />
  13. </property>
  14. <property name="author" type="java.lang.String">
  15. <column name="AUTHOR" />
  16. </property>
  17. <property name="date" type="java.util.Date">
  18. <column name="DATE" />
  19. </property>
  20. </class>
  21. </hibernate-mapping>

3、测试代码

  1. @Test
  2. public void testDynamicUpdate() {
  3. News news =new News();
  4.  
  5. news.setAuthor("test");//注意:这里只设置了test属性
  6. news.setId(13);
  7.  
  8. session.update(news);
  9. }

4、结果

  1. Hibernate:
  2. select
  3. news_.ID,
  4. news_.TITLE as TITLE2_1_,
  5. news_.AUTHOR as AUTHOR3_1_,
  6. news_.DATE as DATE4_1_
  7. from
  8. NEWS news_
  9. where
  10. news_.ID=?
  11. Hibernate:
  12. update
  13. NEWS
  14. set
  15. TITLE=?,
  16. AUTHOR=?,
  17. DATE=?
  18. where
  19. ID=?

hibernate并没有按照期望只update Author属性,而是更新了所有属性,其他属性肯定更新成了null,坏菜了!

网上查了资料,不少同学说要在设置dynamic-update的同时,设置select-before-update即可满足期望,注意上面的映射文件,是设置了该属性的。

那问题出在哪里?如何解决呢?

--------------------------------------------------------------------------------

先看另一段测试代码:

  1. @Test
  2. public void testDynamicUpdate2() {
  3. News news =(News) session.get(News.class, 13);
  4.  
  5. news.setAuthor("test");//注意:这里只设置了test属性
  6.  
  7. session.update(news);
  8. }

 结果如你所愿,只更新了author字段。两项比较,dynamic-update=true,只对持久化对象起作用,对于transient临时对象不起作用。至于为什么这么设计?求高人告之。

Hibernate之dynamic-update的更多相关文章

  1. org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1

    org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actua ...

  2. 20.org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1

    org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actua ...

  3. 关于Hibernate级联更新插入信息时提示主键不为空的问题“org.hibernate.StaleStateException: Batch update returned unexpected row count from update: 0 actual row count: 0 expected: 1 ”

    org.hibernate.StaleStateException: Batch update returned unexpected row count from update: 0 actual ...

  4. Hibernate: save, persist, update, merge, saveOrUpdate[z]

    [z]https://www.baeldung.com/hibernate-save-persist-update-merge-saveorupdate 1. Introduction In this ...

  5. Hibernate merge和update的区别

    今天做了个测试,写了个测试用例来看看merge与update时控制台打印出来的日志有什么不一样.实体bean很简单,就id和name两个字段,接下来分别给出以下几种测试情形的控制台日志内容: 1. 数 ...

  6. BIND9源码分析之 多个view的情况下如何做dynamic update

    BIND中view的存在提供了一种较好的智能DNS方案,BIND可以根据用户的来源IP为其返回不同的Resource Record. 但是关于DNS动态更新的RFC2136中并没有提及view(vie ...

  7. hibernate.hbm2ddl.auto=update不能自动生成表结构

    在写上篇文章<spring整合springmvc和hibernate>的时候,曾遇到一个问题 INFO: Server startup in 8102 ms Hibernate: inse ...

  8. Hibernate HQL的update方法详解

    虽然hibernate提供了许多方法对数据库进行更新,但是这的确不能满足开发需要.现在讲解一下用hql语句对数据进行更新. 不使用参数绑定格式String hql="update User ...

  9. Hibernate不调用update却自动更新

    案例: TInfCustomer cus = (TInfCustomer) this.baseDao.getOne(helper); cus.setXXX cus .setXXX 不调用update也 ...

  10. <property name="hibernate.hbm2ddl.auto">update</property> 问题

    其实这个hibernate.hbm2ddl.auto参数的作用主要用于:自动创建|更新|验证数据库表结构.如果不是此方面的需求建议set value="none".create:每 ...

随机推荐

  1. 各版本SDK Tools及ADT下载技巧

    我们在开发的时候,尤其是使用Eclipse安装ADT插件进行环境配置,我们需要从下载ADT插件及SDK,当我们从官网下载的时候,有的时候可能找不到下载的地方或者下载不到自己想要的版本,我就在此总结下如 ...

  2. JQuery(三)——操作HTML和CSS内容

    前边我们学习过JS通过DOM来操作HTML(详看DOM(一)——HTML DOM ),这篇博客我们来看一下JQuery是如何方便的对HTML以及CSS进行各种操作呢?顺便两者之间相互比较一下,看其差别 ...

  3. Android设置输入框和软键盘动态悬浮

    <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android=&q ...

  4. (转)MarginTop 为何影响父元素的 MarginTop

    这个问题困惑了很久,虽然没有大碍早就摸出来怎么搞定它,但始终不明白原因出在哪里,如果只是IE有问题我也不会太在意,可问题是所有上等浏览器都表现如此,这样叫我怎能安心?今天总算下狠心查出来怎么回事,居然 ...

  5. Oracle使用imp导入dmp数据提示:只有DBA才能导入有其他DBA导入的文件

    使用imp导入时提示:只有DBA才能导入有其他DBA导入的文件 查看权限,发现admin和default栏没有打钩,打上勾就可以了: 打上勾,保存后,继续导入数据,如下: 成功!

  6. css单位和值

    css需要单位来度量.内含整数.小数.百分数的情况,很多条件下支持正负的情况,当然是有限制的了.百分数基本是相对于自身.或是父或是祖先元素的某个属性值. 颜色         颜色的表示分为:命名颜色 ...

  7. Boost.Python:使用继承

    An example #include <boost/python.hpp> #include <memory> #include <iostream> using ...

  8. Flink Program Guide (3) -- Event Time (DataStream API编程指导 -- For Java)

    Event Time 本文翻译自DataStream API Docs v1.2的Event Time ------------------------------------------------ ...

  9. Epipe

    http://www.cnblogs.com/carekee/articles/2904603.html http://blog.chinaunix.net/uid-10716167-id-30805 ...

  10. docker 数据管理<1>

    1. 挂载本地的目录到容器里: docker run -itd -v /data/:/data1 centos bash // -v 用来指定挂载目录, :前面的/data为本地目录,:后面的/dat ...