2013-10-18 105 views
1

我已經映射Mysql數據庫中的列以在java中枚舉。但是在表列中有無效的條目(手工創建),哪些不在我在java中創建的枚舉中。當我嘗試加載條目時,出現以下異常。是否有可能抑制這種異常,即當數據庫中的列中有無效條目時,將枚舉設置爲'null'?Hibernate異常:java.lang.IllegalArgumentException:枚舉類的未知名稱值[]

java.lang.IllegalArgumentException: Unknown name value [] for enum class [model.enums.PeriodUnit] 
at org.hibernate.type.EnumType$NamedEnumValueMapper.fromName(EnumType.java:467) 
at org.hibernate.type.EnumType$NamedEnumValueMapper.getValue(EnumType.java:452) 
at org.hibernate.type.EnumType.nullSafeGet(EnumType.java:107) 
at org.hibernate.type.CustomType.nullSafeGet(CustomType.java:127) 
at org.hibernate.type.AbstractType.hydrate(AbstractType.java:106) 
at org.hibernate.persister.entity.AbstractEntityPersister.hydrate(AbstractEntityPersister.java:2912) 
at org.hibernate.loader.Loader.loadFromResultSet(Loader.java:1673) 
at org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.java:1605) 
at org.hibernate.loader.Loader.getRow(Loader.java:1505) 
at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:713) 
at org.hibernate.loader.Loader.processResultSet(Loader.java:943) 
at org.hibernate.loader.Loader.doQuery(Loader.java:911) 
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:342) 
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:312) 
at org.hibernate.loader.Loader.loadCollection(Loader.java:2238) 
at org.hibernate.loader.collection.CollectionLoader.initialize(CollectionLoader.java:65) 
at org.hibernate.persister.collection.AbstractCollectionPersister.initialize(AbstractCollectionPersister.java:674) 
at org.hibernate.event.internal.DefaultInitializeCollectionEventListener.onInitializeCollection(DefaultInitializeCollectionEventListener.java:85) 
at org.hibernate.internal.SessionImpl.initializeCollection(SessionImpl.java:1849) 
at org.hibernate.collection.internal.AbstractPersistentCollection.forceInitialization(AbstractPersistentCollection.java:681) 
at org.hibernate.engine.internal.StatefulPersistenceContext.initializeNonLazyCollections(StatefulPersistenceContext.java:1030) 
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:347) 
at org.hibernate.loader.Loader.doList(Loader.java:2526) 
at org.hibernate.loader.Loader.doList(Loader.java:2512) 
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2342) 
at org.hibernate.loader.Loader.list(Loader.java:2337) 
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:495) 
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:357) 
at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:195) 
at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1269) 
at org.hibernate.internal.QueryImpl.list(QueryImpl.java:101) 
+0

無法修復數據庫,爲無效值設置空值? –

+0

它可以固定,但它涉及大量的手工工作,我還必須確保它不會破壞其他使用數據庫的應用程序。因此,如果在hibernate中有一種方法可以抑制這些異常並將其設置爲null,那麼這會非常有幫助? – Bourne

回答

1

您必須爲此枚舉指定您自己的休眠類型。讓我們假設你有枚舉

enum SomeEnum {A, B, C} 

SomeEnumType implements UserType, ParameterizedType創建一個自定義類型,你將不得不實行了很多方法,一個你感興趣的是:

@Override 
    public Object nullSafeGet(ResultSet rs, String[] names, SessionImplementor session, Object owner) 
     throws HibernateException, SQLException { 
    Object result = null; 
    try { 
     String name = rs.getString(names[0]); 
     if (!rs.wasNull()) { 
     result = Enum.valueOf(clazz, name); 
     } 
    } catch (Exception e) { 
     // result = null; // Here you handle incorrect database value 
    } 
    return result; 
    } 

你到底將該列映射到您實體的字段:

@Column(name = "some_enum", columnDefinition = "enum('A','B','C')") 
@Type(type = "com.somepackage.SomeEnumType", parameters = @Parameter(name = "type", value = "com.somepackage.SomeEnumType")) 
private SomeEnum someEnum; 
1

即使我的字段已使用@Enumerated正確註釋,我也有類似的問題。

問題如下 - 應用於數據庫的模式DDL將列類型定義爲CHARACTER(5),而在註釋的hibernate實體中,它定義如下,其默認值爲VARCHAR。

@Column 
@Enumerated(EnumType.String) 
private CustomEnumType customEnumType; 

我將Postgres中的數據庫def更改爲customEnumType的VARCHAR。您還可以嘗試通過將其定義爲某種其他類型並在db級別進行相同的更改來更改該列的元數據。

簡而言之,確保您的數據庫表的列定義與hibernate期望的匹配。

相關問題