Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在hibernate映射文件中表示可序列化的Blob类型_Java_Oracle_Hibernate_Jpa_Blob - Fatal编程技术网

Java 如何在hibernate映射文件中表示可序列化的Blob类型

Java 如何在hibernate映射文件中表示可序列化的Blob类型,java,oracle,hibernate,jpa,blob,Java,Oracle,Hibernate,Jpa,Blob,我有一个使用hibernate将对象映射到数据库的遗留应用程序。它使用Hibernate映射XML文件来实现这一点。java类包含两个实现java Serializable的属性abc和def。映射定义如下: <property name="abc" column="ABC" type="serializable" length="32672"/> <property name="def" column="DEF" type="serializable" length="326

我有一个使用hibernate将对象映射到数据库的遗留应用程序。它使用Hibernate映射XML文件来实现这一点。java类包含两个实现java Serializable的属性abc和def。映射定义如下:

<property name="abc" column="ABC" type="serializable" length="32672"/>
<property name="def" column="DEF" type="serializable" length="32672"/>

当我试着用oracle设置时,我遇到了一个严重的错误“ORA-01754:一个表可能只包含一个LONG类型的列”,这实际上是在抱怨在一个表中创建了两个“LONG raw”列。甲骨文不喜欢这样。在阅读了这个问题之后,推荐的方法是使用blob而不是“long-raw”类型

我的问题是,如何在hibernate映射文件中表示使用映射到blob列中的可序列化类型?我认为会有一个可序列化的_blob类型,但似乎没有

我知道这在使用@Basic和@Lob的JPA注释中是可能的。也可以使用hibernate映射文件。如何在hibernate映射文件中实现这一点

更新:

以下内容不能作为可序列化工作:

  • 类型=二进制-此类型需要一个字节[]。不适用于可序列化类。给出ClassCastException
  • type=blob——这个应该是java.sql.blob。不适用于可序列化类。给出ClassCastException
  • type=materialized_blob——这个需要一个字节[]。不适用于可序列化类。给出ClassCastException

...

应该有用。

好的,我在上面的评论之后做了更多的研究,我发现了

在hibernate3.5+Spring3.1中,我使用了Spring的
org.springframework.orm.hibernate3.support.BlobSerializableType
。现在我正在升级到Hibernate4.3,该选项不再可用。我确实发现类型到列的映射是OP,但在我的应用程序中,有各种字符串(遗留)映射到BLOB字段

因此,正如我在上面的评论中所报告的,我找到了
org.hibernate.type.SerializableToBlob
类型,它是参数化的。下面是我如何使映射工作的(使用老式的hbm.xml映射)


java.lang.String

这似乎起到了作用。(我认为,
classname
值应该是您映射的属性类型)

请参见5.1.4.2,这不起作用。如果单独选择“blob”类型,Hibernate希望您的数据类型为java.sql.blob。当您尝试运行它时,这会导致ClassCastException。我发现
org.hibernate.type.SerializableToBlobType
(在4.3中),但看起来您必须扩展它才能添加泛型参数,有效地将其转换为用户类型。但是,由于CLS不是抽象的,它似乎表明必须有另一种方法来使用它。只是设置它除了抛出NPE之外什么都不做
<property
    name="data"
    type="blob"
    column="DATA"/>
...
<property name="description" column="TEXT">
    <type name="org.hibernate.type.SerializableToBlobType">
        <param name="classname">java.lang.String</param>
    </type>
</property>