如何配置 ORMLite 以将 `byte[]` 保存为 DataType.BYTE_ARRAY?

How to configure ORMLite to save `byte[]` as DataType.BYTE_ARRAY?

在我的数据库实体中,我有 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 does not know how to store class [B for field 'passwordHash'. byte[] fields must specify dataType=DataType.BYTE_ARRAY or SERIALIZABLE

据我所知,出于某种原因,ORMLite 不喜欢 BYTE_ARRAY 代替 byte[],并且需要用 com.j256.ormlite.field.Datatype 标记字段 ORMLite 注释引入了对 [=15 的显式依赖=] 模块,这是我想避免的(我有 Hibernate DAO impl 和 ORMLite DAO impl,我不想混合所有东西)。

我的初衷是将 ORMLite 配置为更喜欢 BYTE_ARRAY 用于 byte[] 字段。我该怎么做?我应该介绍自定义持久性吗?还有其他建议吗?

我通过添加以下自定义数据持久性来解决它(没有像我想要的那样添加对 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;
    }
}

像注册任何其他自定义 persister 一样注册它:

DataPersisterManager.registerDataPersisters(PreferByteArrayType.getSingleton());

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

我已经检查过它使用 BLOB 字段类型 MySQL:

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]