如何配置 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]
在我的数据库实体中,我有 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]