【问题标题】:JPA "cannot be cast to java.sql.Blob"JPA“无法转换为 java.sql.Blob”
【发布时间】:2011-03-07 16:30:10
【问题描述】:

我正在使用 JPA2 和休眠 3.6.1。和一个 Derby 数据库,我对 blob 使用了以下注释:

@Column(length = Integer.MAX_VALUE)
@Lob
long[] bucket;

Hibernate 创建了正确的 blob 列,但如果我尝试保存实体,则会出现以下异常:

java.lang.ClassCastException: [J 不能转换为 java.sql.Blob

为什么以及如何才能做到这一点?

如果我在没有 @Lob 的情况下对其进行注释,我会得到一个“Varchar for bit data”列,该列最多只能包含 32m。

【问题讨论】:

    标签: java hibernate blob jpa-2.0 derby


    【解决方案1】:

    您需要将属性映射为 byte[],而不是 long[]。

    documentation

    @Lob 表示该属性 应该保存在 Blob 或 Clob 取决于属性类型: java.sql.Clob、Character[]、char[] 和 java.lang.String 将被持久化 一个克洛布。 java.sql.Blob,字节[],字节[] 和可序列化类型将是 保存在 Blob 中。

    如果属性类型实现 java.io.Serializable 并且不是 基本类型,如果属性不是 用@Lob注解,然后 使用了 Hibernate 可序列化类型。

    如果要持久化数组,则需要构建自定义用户类型来转换数据类型。你可以在这里找到一个例子http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html/entity.html#d0e2794

    【讨论】:

    • 好的,谢谢。有没有其他方法可以持久化 long[] 而无需手动将其“转换”为 byte[] 或其他内容?
    • 请检查答案,我添加了一个链接,其中包含文档中的一个示例。
    猜你喜欢
    • 2014-01-02
    • 1970-01-01
    • 2012-12-14
    • 2019-11-09
    • 2014-09-30
    • 2013-01-26
    • 2021-06-15
    • 1970-01-01
    • 2011-06-29
    相关资源
    最近更新 更多