1.Boolean類型
1.1.使用Boolean類型,而不是Byte類型
1.2.數據庫字段名使用is_開頭
1.3.實體類字段名不使用is開頭
例子
/**
* 是否為新消息
*/
@Column(name = "is_new_message", nullable = false)
private Boolean newMessage;
2.Enum類型
1.使用Convert注解, 并指定coverter類
例子
/**
* 詢盤類型
*/
@Column(name = "type", nullable = false)
@Convert(converter = Type.Convert.class)
private Type type;
2.枚舉類型的規范
2.1. 枚舉類需要實現EntityEnum接口
2.2. 在枚舉類內部定義轉換類, 并實現EntityEnumConverter抽象類
例子
public enum Type implements EntityEnum {
/**
* FRQ詢盤
*/
RFQ(1),
/**
* 詢盤
*/
PRODUCT_INQUIRY(2),
/**
* 私人展會詢盤
*/
PRIVATE_PRODUCT_INQUIRY(3),
/**
* 供應商詢盤
*/
SUPPLIER_INQUIRY(4);
private Integer code;
Type(Integer code) {
this.code = code;
}
public Integer getCode() {
return this.code;
}
@Converter
public static class Convert extends EntityEnumConverter {
}
附錄
枚舉字段接口
/**
* 實體類的枚舉字段都需要實現該接口
* @author Jianhua Ying
*/
public interface EntityEnum {
Integer getCode();
}
枚舉字段轉換器抽象類
import javax.persistence.AttributeConverter;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
/**
* 實體類的枚舉字段的轉換器基類
*
* @param 枚舉字段的類
*/
public abstract class EntityEnumConverter implements AttributeConverter {
private Class xclazz;
private Method valuesMethod;
@SuppressWarnings("unchecked")
public EntityEnumConverter() {
this.xclazz = (Class) (((ParameterizedType) this.getClass().getGenericSuperclass())
.getActualTypeArguments())[0];
try {
valuesMethod = xclazz.getMethod("values");
} catch (Exception e) {
throw new RuntimeException("can't get values method from " + xclazz);
}
}
@Override
public Integer convertToDatabaseColumn(EntityEnum attribute) {
return attribute == null ? null : attribute.getCode();
}
@SuppressWarnings("unchecked")
@Override
public X convertToEntityAttribute(Integer dbData) {
try {
X[] values = (X[]) valuesMethod.invoke(null);
for (X x : values) {
if (x.getCode().equals(dbData)) {
return x;
}
}
} catch (Exception e) {
throw new RuntimeException("can't convertToEntityAttribute" + e.getMessage());
}
throw new RuntimeException("unknown dbData " + dbData);
}
}