`
jokeymzx
  • 浏览: 51725 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

一个hibernate字段无法更新的问题

阅读更多

问题如下:

 

public class TestPO{

 private  String code;
  
 private String name;
  
  public void setCode(String code){
    this.code=code;
  }
  
  public String getCode(){
    return this.code;
  }
  
    public void setName(String name){
    this.name=name;
  }
  
  public String getName(){
    return this.name;
  }
  
 // .................
}

 

 

对应的映射文件,TestPO.hbm.xml:

 

<hibernate-mapping>
    <class name="TestPO" table="TestPO">
        <id name="code" type="java.lang.String">
            <column name="code" length="12" />
            <generator class="assigned" />
        </id>
        <property name="name" type="java.lang.String">
            <column name="name" length="30" />
        </property>        
       // .....................
    </class>
</hibernate-mapping>

 

 

由于历史数据的原因数据库code的设计为了char(12)

 

  //..........获取Session
  TestPO testPO = new TestPO();
  testPO.setCode("00000001");//注意:"00000001"没有12位
  testPO.setName("name1");
  session.saveOrUpdate(testPO);
  
  testPO.setName("name2");
  session.saveOrUpdate(testPO);

 

 

 提交事物后,发现数据库的name的值依然为"name1"
 
 
 可能的原因:
 当执行第二次保存的时候,相当于执行下面的语句:
 update TestPO set name='name2' where code='00000001' ;
 这条sql语句如果是用一般的客户端执行,也没有问题.
 
 问题在于hibernate采用的预处理,即相当于采用下面的方式:

 

 PreparedStatement prepareStatement = session.connection()
 .prepareStatement("update TestPO set name='name2' where code=? ");
 prepareStatement.setString(1, "K000003");
 prepareStatement.execute();
 

  解决的方法:
 1、修改数据库,将code改为varchar2(12),如果数据库是遗留库,最好采用下面的方法
 2、testPO.setCode("00000001     ");//用空格补齐12位
 
 在一般的开发中可能比较难遇到这种问题,如果在开发中用到了遗留的数据库时,需要留意了。

2
0
分享到:
评论
3 楼 yushan 2008-10-21  
yushan 写道

俺刚学Hibernate 不久 ,但对于楼主说的 提交事物后,发现数据库的name的值依然为"name1",我测试了一遍 数据库的name已经变成了name2 我用的的Mysql数据库Hibernate 数据代码如下Hibernate: select test_.code, test_.name as name5_ from schoolproject.test test_ where test_.code=?Hibernate: insert into schoolproject.test (name, code) values (?, ?)Hibernate: update schoolproject.test set name=? where code=?在同一个事物中 当第一次 执行session.saveOrUpdate(testPO);后testPO对象已成持久状态所以 testPO.setName("name2");&nbsp; 就可以直接更改数据库中的内容即执行update这一句 就不需要第二次session.saveOrUpdate(testPO);了不知楼主用的是那种数据库?

补充说明:其xml配置和po类 与楼主的一样,code字段也是char(12) 为主键
2 楼 yushan 2008-10-21  
俺刚学Hibernate 不久 ,但对于楼主说的 提交事物后,发现数据库的name的值依然为"name1",我测试了一遍 数据库的name已经变成了name2 我用的的Mysql数据库
Hibernate 数据代码如下
Hibernate: select test_.code, test_.name as name5_ from schoolproject.test test_ where test_.code=?
Hibernate: insert into schoolproject.test (name, code) values (?, ?)
Hibernate: update schoolproject.test set name=? where code=?
在同一个事物中 当第一次 执行session.saveOrUpdate(testPO);后testPO对象已成持久状态所以 testPO.setName("name2");  就可以直接更改数据库中的内容即执行update这一句
就不需要第二次session.saveOrUpdate(testPO);了
不知楼主用的是那种数据库?
1 楼 dayang2001911 2008-10-20  
恩是,char的是这样,id的话就设成varchar的或者别的吧。

相关推荐

    Hibernate更新某些字段

    如果我们直接使用 Session.update(Object o) 方法,Hibernate 会生成一个更新所有字段的 SQL 语句。这可能会导致性能问题,特别是当某些字段类型是文本类型且内容非常大时。 例如,在下面的代码中,我们使用 ...

    Hibernate_query查询数据表中的一个字段.

    本篇将详细讲解如何使用Hibernate进行查询,特别是针对数据表中的一个特定字段。 一、Hibernate简介 Hibernate是Java领域的一个开源ORM框架,它简化了数据库操作,通过映射Java类到数据库表,可以将数据库操作转化...

    注意hibernate查单一字段和查两个以上的字段返回的结果

    Hibernate是Java领域的一个流行ORM(对象关系映射)框架,它允许开发者用面向对象的方式操作数据库。 在Hibernate中,查询主要通过Criteria API、HQL(Hibernate Query Language)或JPA的Query接口来实现。当我们...

    Hibernate中对表某个字段排序

    Hibernate中对表某个字段排序,直接在配置里面实现排序功能。

    用Hibernate实现领域对象的自定义字段

    在Java世界中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者将数据库操作与业务逻辑解耦,通过面向对象的方式处理数据。本文将深入探讨如何使用Hibernate实现领域对象的自定义字段,这涉及到对...

    hibernate根据字段生成数据库表

    Hibernate 提供了一个非常实用的功能——基于实体类自动生成数据库表,这不仅能够显著提高开发效率,还能减少人为错误。本文将详细介绍如何利用 Hibernate 的 `SchemaExport` 类实现这一功能。 #### 二、准备工作 ...

    hibernate实体映射文件字段设置默认值

    首先,我们需要了解一个基本的Hibernate映射文件结构: ```xml &lt;hibernate-mapping&gt; &lt;!-- 映射类的属性 --&gt; &lt;/hibernate-mapping&gt; ``` 这里的`&lt;class&gt;`标签表示映射到特定的Java类,其属性`name`指定了对应的...

    Hibernate 配置跟数据库字段的对应关系

    在Java开发中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者使用面向对象的方式来操作数据库,而无需关心底层SQL语句。本文将深入探讨如何在Hibernate配置中设置与数据库字段的对应关系,以及...

    hibernate使用中与各种数据库字段类型对应类型训练

    在Java世界中,Hibernate是一个非常流行的持久化框架,它简化了数据库操作,使得开发者可以更加专注于业务逻辑而不是底层数据访问的细节。本训练主要关注在使用Hibernate时如何处理与各种数据库字段类型的映射,这...

    hibernate的第一个例子

    **标题解析:**“hibernate的第一个例子”表明这是一个关于Hibernate框架的基础教程,主要目标是展示如何使用Hibernate进行数据持久化操作。 **描述分析:**描述提到这是一个超级简单的例子,包含一个持久化对象...

    Hibernate读取blob字段

    在Hibernate的映射文件(.hbm.xml)中,我们需要为Blob字段定义一个对应的元素。例如,假设我们有一个`Image`实体类,其中包含一个`imageData`字段用于存储Blob类型的图像数据,映射文件的部分内容可能如下所示: ...

    hibernate第一个hibernate

    Hibernate是一个开源的Java库,它提供了一种在Java应用中持久化数据的方式,使得开发者无需编写大量的SQL语句,即可实现对数据库的CRUD(创建、读取、更新和删除)操作。它的核心理念是将面向对象的模型映射到传统...

    Spring+Hibernate处理Oracle lob字段(一)

    在实体类中,我们需要声明一个对应的字段,并使用Hibernate的@Lob注解来标识这是一个LOB字段。例如: ```java @Entity public class MyEntity { @Id private Long id; @Lob private Blob image; // 对应BLOB...

    hibernate 进行多表查询每个表中各取几个字段

    在Java的持久化框架中,Hibernate是一个非常流行的ORM(对象关系映射)工具,它允许开发者用面向对象的方式来处理数据库操作。本篇文章将探讨如何在Hibernate中进行多表查询,并从每个表中选取特定的字段。 一、...

    Hibernate_query查询数据表中部分字段.

    在IT领域,尤其是在Java开发中,Hibernate是一个非常重要的对象关系映射(ORM)框架,它极大地简化了数据库操作。本文将深入探讨如何使用Hibernate进行数据表中的部分字段查询,这在实际开发中是非常常见的需求。 ...

    spring+hibernate 解决大字段(clob)

    这里的`type`属性被设置为"text",表明这是一个CLOB字段。需要注意的是,在不同版本的Oracle数据库中,CLOB字段的类型可能有所不同。例如,在Oracle 9i中,可以尝试使用自定义类型`org.springframework.orm....

    我的第一个Hibernate 程序

    【我的第一个Hibernate程序】这篇文章是关于初学者如何创建并运行第一个Hibernate程序的详细教程。Hibernate是一个流行的Java ORM(对象关系映射)框架,它允许开发者将数据库操作转换为面向对象的编程,简化了数据...

    Hibernate操作Oarcle中Clob、Blob字段小结

    在Java的持久化框架Hibernate中,处理大数据类型如Oracle数据库中的Clob(Character Large Object)和Blob(Binary Large Object)字段是一项重要的任务。Clob通常用于存储大量的文本数据,而Blob则适用于二进制...

Global site tag (gtag.js) - Google Analytics