问题如下:
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位
在一般的开发中可能比较难遇到这种问题,如果在开发中用到了遗留的数据库时,需要留意了。
分享到:
相关推荐
如果我们直接使用 Session.update(Object o) 方法,Hibernate 会生成一个更新所有字段的 SQL 语句。这可能会导致性能问题,特别是当某些字段类型是文本类型且内容非常大时。 例如,在下面的代码中,我们使用 ...
本篇将详细讲解如何使用Hibernate进行查询,特别是针对数据表中的一个特定字段。 一、Hibernate简介 Hibernate是Java领域的一个开源ORM框架,它简化了数据库操作,通过映射Java类到数据库表,可以将数据库操作转化...
Hibernate是Java领域的一个流行ORM(对象关系映射)框架,它允许开发者用面向对象的方式操作数据库。 在Hibernate中,查询主要通过Criteria API、HQL(Hibernate Query Language)或JPA的Query接口来实现。当我们...
Hibernate中对表某个字段排序,直接在配置里面实现排序功能。
在Java世界中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者将数据库操作与业务逻辑解耦,通过面向对象的方式处理数据。本文将深入探讨如何使用Hibernate实现领域对象的自定义字段,这涉及到对...
Hibernate 提供了一个非常实用的功能——基于实体类自动生成数据库表,这不仅能够显著提高开发效率,还能减少人为错误。本文将详细介绍如何利用 Hibernate 的 `SchemaExport` 类实现这一功能。 #### 二、准备工作 ...
首先,我们需要了解一个基本的Hibernate映射文件结构: ```xml <hibernate-mapping> <!-- 映射类的属性 --> </hibernate-mapping> ``` 这里的`<class>`标签表示映射到特定的Java类,其属性`name`指定了对应的...
在Java开发中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者使用面向对象的方式来操作数据库,而无需关心底层SQL语句。本文将深入探讨如何在Hibernate配置中设置与数据库字段的对应关系,以及...
在Java世界中,Hibernate是一个非常流行的持久化框架,它简化了数据库操作,使得开发者可以更加专注于业务逻辑而不是底层数据访问的细节。本训练主要关注在使用Hibernate时如何处理与各种数据库字段类型的映射,这...
**标题解析:**“hibernate的第一个例子”表明这是一个关于Hibernate框架的基础教程,主要目标是展示如何使用Hibernate进行数据持久化操作。 **描述分析:**描述提到这是一个超级简单的例子,包含一个持久化对象...
在Hibernate的映射文件(.hbm.xml)中,我们需要为Blob字段定义一个对应的元素。例如,假设我们有一个`Image`实体类,其中包含一个`imageData`字段用于存储Blob类型的图像数据,映射文件的部分内容可能如下所示: ...
Hibernate是一个开源的Java库,它提供了一种在Java应用中持久化数据的方式,使得开发者无需编写大量的SQL语句,即可实现对数据库的CRUD(创建、读取、更新和删除)操作。它的核心理念是将面向对象的模型映射到传统...
在实体类中,我们需要声明一个对应的字段,并使用Hibernate的@Lob注解来标识这是一个LOB字段。例如: ```java @Entity public class MyEntity { @Id private Long id; @Lob private Blob image; // 对应BLOB...
在Java的持久化框架中,Hibernate是一个非常流行的ORM(对象关系映射)工具,它允许开发者用面向对象的方式来处理数据库操作。本篇文章将探讨如何在Hibernate中进行多表查询,并从每个表中选取特定的字段。 一、...
在IT领域,尤其是在Java开发中,Hibernate是一个非常重要的对象关系映射(ORM)框架,它极大地简化了数据库操作。本文将深入探讨如何使用Hibernate进行数据表中的部分字段查询,这在实际开发中是非常常见的需求。 ...
这里的`type`属性被设置为"text",表明这是一个CLOB字段。需要注意的是,在不同版本的Oracle数据库中,CLOB字段的类型可能有所不同。例如,在Oracle 9i中,可以尝试使用自定义类型`org.springframework.orm....
【我的第一个Hibernate程序】这篇文章是关于初学者如何创建并运行第一个Hibernate程序的详细教程。Hibernate是一个流行的Java ORM(对象关系映射)框架,它允许开发者将数据库操作转换为面向对象的编程,简化了数据...
在Java的持久化框架Hibernate中,处理大数据类型如Oracle数据库中的Clob(Character Large Object)和Blob(Binary Large Object)字段是一项重要的任务。Clob通常用于存储大量的文本数据,而Blob则适用于二进制...