【发布时间】:2010-10-11 19:50:17
【问题描述】:
我正在使用 Oracle 10g 和 Hibernate 2.1(旧版本,但不允许升级修复)。我有一个表,其中包含一个不可为空的列,名为 TIN,varchar2(9)。此列用于暂存从平面文件加载的数据,因此可以存储长度为 9 的任何字符串,如果输入文件有 9 个空格,则包括 9 个空格(即:'')。
我注意到的是:
-
Oracle 10g 自动将空字符串转换为 NULL。所以如果你执行:
SELECT NVL('', 'Input string converted to NULL') FROM dual;结果是'输入字符串转换为NULL',而不是''。我认为这与问题有关。
当 Hibernate 读取 TIN 值为 9 个空格(或任意数量的空格)且没有其他字符的记录时,它将值作为 '' 存储在内存中。然后,Hibernate 似乎自欺欺人地认为,可以说,该值已从 9 个空格变为空字符串。然后,如果将记录写回数据库,Hibernate 会尝试写入一个空字符串而不是 9 个空格,Oracle 显然会将其转换为 null,然后引发非空约束违规。
作为参考,以下是本专栏的 HBM:
<property
name="tin"
type="java.lang.String"
column="TIN"
not-null="true"
length="9">
我的问题是,如何指示 Hibernate 不要将仅包含空格的值转换为空字符串?
更新1:我刚回去测试了像'text'这样的字符串,发现Hibernate也修剪了这些空格,使字符串'text'并自欺欺人地认为值改变了。我肯定错过了什么。这似乎不是默认行为。
更新 2:看起来将 HBM 转换为 Java 源的 hbm2java Ant 任务可能是字符串修剪的源。仍在调查中。
谢谢, 杰夫
编辑:将问题措辞更改为更准确。
【问题讨论】: