在我的数据库实体中,我有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[]
字段。我该怎么做?我应该介绍自定义容量吗?还有其他建议吗?
答案 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]