zoukankan      html  css  js  c++  java
  • Hibernate之dynamic-update

    问题:设置了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 }
    View Code

    2、hbm.xml

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

    3、测试代码

    	@Test
    	public void testDynamicUpdate() {
    		News news =new News();
    
    		news.setAuthor("test");//注意:这里只设置了test属性
    		news.setId(13);
    		
    		session.update(news);
    	}
    

    4、结果

    Hibernate: 
        select
            news_.ID,
            news_.TITLE as TITLE2_1_,
            news_.AUTHOR as AUTHOR3_1_,
            news_.DATE as DATE4_1_ 
        from
            NEWS news_ 
        where
            news_.ID=?
    Hibernate: 
        update
            NEWS 
        set
            TITLE=?,
            AUTHOR=?,
            DATE=? 
        where
            ID=?
    

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

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

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

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

       先看另一段测试代码:

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

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

  • 相关阅读:
    python命令行参数处理
    linux进程管理
    hadoop
    linux进程间通信之信号
    HA for openstack
    ubutun 安装php7.1x
    php 函数小技巧(一)
    git error: RPC failed; result=56, HTTP code = 200
    php面试题汇总四(基础篇附答案)
    php面试题汇总三(基础篇附答案)
  • 原文地址:https://www.cnblogs.com/sdnu/p/5286768.html
Copyright © 2011-2022 走看看