2015-11-12 165 views
0

我有一个系统,一些长期离开的编码器决定,当用户被锁定时,account_locked值应该是“P”而不是“Y”。 “N”仍然等于假值。当然,因为它是一个生产系统,所以我不能修改它来使用标准的“Y”。错误注册休眠TypeDef

所以,我从标准的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的似乎被忽略。 (实际上,即使我们删除了Hibernate YesNoType,我仍然看到“Y”正在写入数据库。

我在做什么明显错误吗?

回答

1

刚刚在做类似的事情时发现此线程。在我的场景中,我还更改了将一些参数传递给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)); 
}