如何在hibernate映射文件中表示Serializable Blob类型

时间:2011-09-29 18:11:02

标签: java oracle hibernate jpa blob

我有一个遗留应用程序,它使用hibernate将对象映射到数据库中。它使用Hibernate Mapping 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列的可序列化类型?我认为会有一个serializable_blob类型,但似乎没有。

我知道使用@Basic和@Lob进行JPA注释是可行的。它也应该可以使用hibernate映射文件。如何在hibernate映射文件中完成?

更新

以下可以作为Serializable工作:

  • type = binary - 这个需要一个byte []。不适用于Serializable类。提供ClassCastException。
  • type = blob - - 这个需要一个java.sql.Blob。不适用于Serializable类。提供ClassCastException。
  • type = materialized_blob - - 这个需要一个byte []。不适用于Serializable类。提供ClassCastException。

2 个答案:

答案 0 :(得分:0)

<property
    name="data"
    type="blob"
    column="DATA"/>
...

应该有用。

答案 1 :(得分:0)

好的,在我上面的评论之后做了一些更多的研究,并且通过Jove,我发现了它。

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

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

<property name="description" column="TEXT">
    <type name="org.hibernate.type.SerializableToBlobType">
        <param name="classname">java.lang.String</param>
    </type>
</property>

这似乎可以解决问题。 (classname值应该是您要映射的属性的类型,我认为)