考虑在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映射到布尔值,即使它应该知道这应该被映射为一个枚举。
mysql用来不支持'bit'字段,并将它们翻译为'tinyint(1)'。许多接口库被硬编码以将tinyint(1)视为布尔值来进行补偿。 – 2014-09-25 15:14:49
你试过columnDefinition吗? – 2014-09-25 15:16:33