2014-09-25 36 views
0

考慮在Java中,下列枚舉:爲什麼hibernate將tinyint(1)映射到java.lang.Boolean?

public enum Color { 
    RED, 
    GREEN 
} 

在JPA實體

@Column(name = "COLOR") 
private Color color; 

的定義和MySQL DDL:

`COLOR` tinyint(1) NOT NULL 

爲什麼Hibernate的3.5似乎永遠映射tinyint(1)轉換爲java.lang.Boolean,導致以下異常:

java.lang.ClassCastException: java.lang.Boolean cannot be cast to java.lang.String 
    at org.hibernate.type.EnumType.nullSafeGet(EnumType.java:119) 
    at org.hibernate.type.CustomType.nullSafeGet(CustomType.java:132) 
    at org.hibernate.type.AbstractType.hydrate(AbstractType.java:105) 
    at org.hibernate.persister.entity.AbstractEntityPersister.hydrate(AbstractEntityPersister.java:2267) 
    at org.hibernate.loader.Loader.loadFromResultSet(Loader.java:1423) 
    at org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.java:1351) 
    at org.hibernate.loader.Loader.getRow(Loader.java:1251) 
    at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:619) 
    at org.hibernate.loader.Loader.doQuery(Loader.java:745) 
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:270) 
    at org.hibernate.loader.Loader.doList(Loader.java:2294) 
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2172) 
    at org.hibernate.loader.Loader.list(Loader.java:2167) 
    at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:448) 
    at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:363) 
    at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:196) 
    at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1258) 
    at org.hibernate.impl.QueryImpl.list(QueryImpl.java:102) 
    at org.hibernate.ejb.QueryImpl.getSingleResult(QueryImpl.java:264) 

這似乎很容易通過將DDL更改爲tinyint(2)來解決。然而,我想知道這是否是有意的,爲什麼hibernate映射到布爾值,即使它應該知道這應該被映射爲一個枚舉。

+1

mysql用來不支持'bit'字段,並將它們翻譯爲'tinyint(1)'。許多接口庫被硬編碼以將tinyint(1)視爲布爾值來進行補償。 – 2014-09-25 15:14:49

+0

你試過columnDefinition嗎? – 2014-09-25 15:16:33

回答

3

根據the mysql jdbc type mapping,這不僅是預期的行爲,它的記錄。嚴格地說,Hibernate不是在做映射,jdbc驅動程序是。你可以用file a bug來對付mysql,如果你認爲這個行爲應該改變,那麼你可以做個例子。

1

這是可能的編寫自定義UserType告訴休眠到TINYINT(1)映射到一個枚舉

class EnumUserType<T extends Enum<T>> implements UserType { ... } 

你只需要實現nullSafeSetnullSafeGet方法,你的枚舉映射,從整結果集。

,那麼該類型的註釋添加到您的實體柱

@org.hibernate.annotations.Type(type = "com.myco.EnumUserType") 

當然,你可以告訴mysql無法通過設置tinyInt1isBit JDBC connection property爲false TINYINT(1)映射到了一點,但這會影響您的所有TINYINT(1)秒。

相關問題