我有一个系统,一些长期离职的程序员决定,当用户被锁定时,account_locked值应该是"p"而不是"Y"。"N"仍然相当于一个假值。当然,由于它是一个生产系统,我不能将它修改为使用标准的"Y"。
因此,我借用了标准Hibernate YesNoType的代码,并对其进行了如下修改:
public class PasswordLockType extends AbstractSingleColumnStandardBasicType<Boolean>
implements PrimitiveType<Boolean>, DiscriminatorType<Boolean> {
private static final long serialVersionUID = 1L;
public static final PasswordLockType INSTANCE = new PasswordLockType();
public PasswordLockType() {
super( CharTypeDescriptor.INSTANCE, BooleanTypeDescriptor.INSTANCE );
}
public String getName() {
return "passwordLock";
}
public Class getPrimitiveClass() {
return boolean.class;
}
public Boolean stringToObject(String xml) throws Exception {
return fromString( xml );
}
public Serializable getDefaultValue() {
return Boolean.FALSE;
}
@SuppressWarnings({ "UnnecessaryUnboxing" })
public String objectToSQLString(Boolean value, Dialect dialect) throws Exception {
return StringType.INSTANCE.objectToSQLString( value.booleanValue() ? "P" : "N", dialect );
}
}
然后我修改ApplicationUser类如下:
@Entity
@TypeDefs(
@TypeDef(name="passwordLock", typeClass=PasswordLockType.class)
)
public class ApplicationUser implements UserDetails, Comparable<ApplicationUser>, Serializable {
// other fields
private Boolean accountLocked;
@Column(name = "LOCK_CD")
@Type(type="passwordLock")
public Boolean getAccountLocked() {
return accountLocked;
}
不幸的是,typedef似乎被忽略了。(实际上,我仍然看到"Y"被写入数据库,尽管我们删除了Hibernate YesNoType)。
我是不是做错了什么?
刚刚在做类似的事情时发现了这个线程。在我的场景中,我还更改了将一些参数传递给BooleanTypeDescriptor:的构造函数
private static final char CHARACTER_VALUE_TRUE = 'J';
private static final char CHARACTER_VALUE_FALSE = 'N';
public JaNeinType() {
super(CharTypeDescriptor.INSTANCE, new BooleanTypeDescriptor(CHARACTER_VALUE_TRUE, CHARACTER_VALUE_FALSE));
}