2015-11-12 168 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)); 
}