Java 如何防止Hibernate修剪字符串?
我使用的是Oracle 10g和Hibernate 2.1(旧版本,但不允许升级到fix)。我有一个表,它有一个名为TIN的不可为null的列,varchar2(9)。此列用于暂存从平面文件加载的数据,因此可以存储任何长度为9的字符串,包括9个空格(即:“”),如果输入文件有9个空格 我注意到的是:Java 如何防止Hibernate修剪字符串?,java,oracle,hibernate,Java,Oracle,Hibernate,我使用的是Oracle 10g和Hibernate 2.1(旧版本,但不允许升级到fix)。我有一个表,它有一个名为TIN的不可为null的列,varchar2(9)。此列用于暂存从平面文件加载的数据,因此可以存储任何长度为9的字符串,包括9个空格(即:“”),如果输入文件有9个空格 我注意到的是: Oracle 10g会自动将空字符串转换为空字符串。因此,如果您执行: SELECT NVL('', 'Input string converted to NULL') FROM dual; 结
SELECT NVL('', 'Input string converted to NULL') FROM dual;
结果是“输入字符串转换为NULL”,而不是“”。我认为这与问题有关<property
name="tin"
type="java.lang.String"
column="TIN"
not-null="true"
length="9">
我的问题是,如何指示Hibernate不要将只包含空格的值转换为空字符串
更新1:我刚刚回去测试了像“text”这样的字符串,发现Hibernate也会修剪这些空格,使字符串成为“text”,并欺骗自己认为值发生了变化。我一定错过了什么。这看起来不像是默认行为
更新2:看起来将HBM转换为Java源的hbm2java Ant任务可能是字符串trims的源。仍在调查中
谢谢,
杰夫
编辑:将问题的措辞改得更精确。我不知道hibernate。但我知道Oracle确实将空字符串视为空值。而且没有任何解决办法。解决这个问题的一种方法是。在hibernate.org上的链接中有一些关于字符串转义的说明。我意识到这并没有直接回答“如何告诉hibernate不要将9个空格转换为空字符串”,但它将解决数据库端的存储问题 该页上有两个实现—一个用于转义所有字符串(可能以您希望的方式处理9个空格的大小写),另一个仅转义值“”。听起来前者可能更适合你 作为记录,我自己也在使用这种方法。您所需要做的就是将类放在类路径中,并将HBM.xml中的“type”属性设置为完全限定的类名(即将type=“my.full.qualified.HibernateUserType”添加到属性元素中)
在Java端,您的类仍将直接处理Java.lang.String和您希望看到的值,但在hibernate端,它们将使用UserType类。结果表明,问题不在于hibernate。我正在从事的项目是使用hbm2java Ant任务从HBM文件生成Java POJO的。这又引用了getter/setters/equals/toString/etc的源模板,该模板是为修剪setter中的所有java.lang.String属性而编写的。为了解决这个问题,我对我遇到问题的一个类进行了钝化,这样它就不会在每个构建中生成,然后删除了TIN属性上的修剪。谢谢Joshua。这似乎是一个很好的方法。我所看到的最大问题是,在Hibernate之外访问该数据的所有东西都必须知道这些值是转义的。我想我想知道Hibernate修剪值的这种行为是否正常/有文档记录。如果Hibernate之外还有其他部分的代码访问数据库,那就是一个问题。不幸的是,情况就是这样。为批量处理平面文件而编写的存储过程可以读/写同一列。谢谢你。你的回答很可靠。