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

时间:2018-06-16 18:46:14

标签: java database jpa persistence ormlite

在我的数据库实体中,我有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不知道如何存储类[B for field' passwordHash'。 byte []字段必须指定dataType = DataType.BYTE_ARRAY或SERIALIZABLE

据我所知,由于某些原因,ORMLite不喜欢byte[]的BYTE_ARRAY,并要求用com.j256.ormlite.field.Datatype ORMLite注释标记字段,并引入对ormlite-core模块的显式依赖,这是我想避免什么(我有Hibernate DAO impl和ORMLite DAO impl,我不想混合所有东西)。

我的初衷是将ORMLite配置为BYTE_ARRAY byte[]字段。我该怎么做?我应该介绍自定义容量吗?还有其他建议吗?

1 个答案:

答案 0 :(得分: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]