Java 如何防止Hibernate修剪字符串?

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; 结

我使用的是Oracle 10g和Hibernate 2.1(旧版本,但不允许升级到fix)。我有一个表,它有一个名为TIN的不可为null的列,varchar2(9)。此列用于暂存从平面文件加载的数据,因此可以存储任何长度为9的字符串,包括9个空格(即:“”),如果输入文件有9个空格

我注意到的是:

  • Oracle 10g会自动将空字符串转换为空字符串。因此,如果您执行:

    SELECT NVL('', 'Input string converted to NULL') FROM dual; 
    
    结果是“输入字符串转换为NULL”,而不是“”。我认为这与问题有关

  • 当Hibernate读取TIN值为9个空格(或任意数量的空格)且没有其他字符的记录时,它将该值存储在内存中为“”。然后Hibernate似乎在欺骗自己,让自己认为值已从9个空格变为空字符串。然后,如果记录被写回数据库,Hibernate会尝试写入一个空字符串,而不是9个空格,Oracle显然会将其转换为null,然后抛出一个NOTNULL约束冲突

  • 以下是本专栏的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任务可能是字符串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之外还有其他部分的代码访问数据库,那就是一个问题。不幸的是,情况就是这样。为批量处理平面文件而编写的存储过程可以读/写同一列。谢谢你。你的回答很可靠。