【问题标题】:Force JPA entity field type to BLOB强制 JPA 实体字段类型为 BLOB
【发布时间】:2016-02-09 13:28:25
【问题描述】:

在现有的 Java EE 应用程序中有一个 JPA 实体,其中包含一个字符串数组作为字段。不好,但它就是这样。它没有任何注释,在 Hibernate(在 JBoss EAP 6.1 Alpha 和 MySQL 5.6 上)中运行应用程序会将其存储为 TINYBLOB。一旦字符串数组包含多个值,这显然会失败,但只要数组不是太大,它就可以正常工作。

有没有办法通过 JPA 2(不是 Hibernate!)注释强制将该字段视为 BLOB 而不是 TINYBLOB

在设置过程中使用以下内容实际上会创建BLOB 类型的列,但在尝试存储实体实例时它仍然会失败

java.lang.ClassCastException: [Ljava.lang.String; cannot be cast to java.lang.String"

字段注解定义:

@Lob
@Column(columnDefinition = "blob")

【问题讨论】:

  • 你应该删除你的@Column注释,或者你应该有一个@Column(columnDefinition = "clob"),因为你想要一个variable-length character large object string
  • @aribeiro 但我不能 - 那么我现有的所有条目都已损坏。
  • 那么,如何创建一个新的带有@Column(columnDefinition = "clob") 注释的字段,从现在开始逐渐使用,并将另一个标记为@Deprecated?您可以更改您的代码,以便所有更新和新插入都将引用新字段,然后会出现一个安全点,可以安全地删除您的 blob 字段。

标签: java jpa jakarta-ee


【解决方案1】:

我认为你正在写作。为避免 ClassCastException 尝试添加转换器 cals 并手动对其进行序列化。添加注解@Convert(converter = YoursConvertor.class)并实现转换器类,如下所示:

public class YoursConvertor implements AttributeConverter<String[], String> {

    @Override
    public String convertToDatabaseColumn(String[] meta) {
         String concatString = "";
         //... some concatinantion etc
         return concatString;
    }

    @Override
    public String[] convertToEntityAttribute(String dbData) {
        String[] result = null;
        if (dbData != null && dbData.length() > 0) {
            //... unconcat
        }
        return result;
    }
}

也许它必须是 String[], byte[] - 你应该试试

【讨论】:

    猜你喜欢
    • 2013-11-24
    • 1970-01-01
    • 2021-09-21
    • 2017-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-22
    • 2014-06-22
    相关资源
    最近更新 更多