【问题标题】:How to configure ORMLite to save `byte[]` as DataType.BYTE_ARRAY?如何配置 ORMLite 以将 `byte[]` 保存为 DataType.BYTE_ARRAY?
【发布时间】:2018-11-26 04:41:09
【问题描述】:

在我的数据库实体中,我有 byte[] 字段:

import javax.persistence.*;

/**
 *  Account
 */
@Entity
@Table(name = TABLE)
public class Account {
    public static final String TABLE = "Account";
    ...

    public final static String COLUMN_PASSWORD_HASH = "passwordHash";
    @Column(name = COLUMN_PASSWORD_HASH, nullable = false)
    public byte[] passwordHash;

    ...

我想让我的数据库实体不依赖任何供应商,所以我只使用 JPA 注释并尽量避免使用任何 ORMLite 或 Hibernate 注释。

但是,当尝试使用 ORMLite 保存此类实体时,出现以下错误:

java.sql.SQLException:ORMLite 不知道如何为字段“passwordHash”存储类 [B。 byte[] 字段必须指定 dataType=DataType.BYTE_ARRAY 或 SERIALIZABLE

据我了解,由于某种原因,ORMLite 不喜欢 BYTE_ARRAY 用于 byte[],并且需要使用 com.j256.ormlite.field.Datatype ORMLite 注释标记字段,并引入了对 ormlite-core 模块的显式依赖,这就是我想要避免的(我有 Hibernate DAO impl 和 ORMLite DAO impl,我不想混合所有内容。

我的初衷是将ORMLite配置为首选BYTE_ARRAY作为byte[]字段。我该怎么做?我应该引入自定义持久化器吗?还有其他建议吗?

【问题讨论】:

  • 仅供参考:ORMLite 最初将 byte[] 视为 Serializable,我不希望它随意更改类型,所以我强迫用户选择其中一个。

标签: java database jpa persistence ormlite


【解决方案1】:

我通过添加以下自定义数据持久性解决了这个问题(没有像我想要的那样添加对ormlite-core 的依赖):

package name.antonsmirnov.zzz.dao.types;

import com.j256.ormlite.field.SqlType;
import com.j256.ormlite.field.types.ByteArrayType;

/**
 * ByteArray Type that prefers storing byte[] as BYTE_ARRAY
 */
public class PreferByteArrayType extends ByteArrayType {

    public PreferByteArrayType() {
        super(SqlType.BYTE_ARRAY, new Class[] { byte[].class });
    }

    private static final PreferByteArrayType singleTon = new PreferByteArrayType();

    public static PreferByteArrayType getSingleton() {
        return singleTon;
    }
}

像任何其他自定义持久化器一样注册它:

DataPersisterManager.registerDataPersisters(PreferByteArrayType.getSingleton());

请注意,您不能使用默认的 ByteArrayDataType,因为它有空的 classes 数组,因此它会导致它成为自动生成字段的持久化器,并且会抛出字节数组字段不能是 id 字段的异常。

我已经检查了它是否使用 MySQL 的 BLOB 字段类型:

com.mysql.jdbc.Field@39a2bb97[catalog=test_db,tableName=account,originalTableName=account,columnName=passwordHash,originalColumnName=passwordHash,mysqlType=252(FIELD_TYPE_BLOB),flags= BINARY BLOB, charsetIndex=63, charsetName =ISO-8859-1]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多