Java 如何在hibernate映射文件中表示可序列化的Blob类型
我有一个使用hibernate将对象映射到数据库的遗留应用程序。它使用Hibernate映射XML文件来实现这一点。java类包含两个实现java Serializable的属性abc和def。映射定义如下: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
<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>