2013-10-18 5 views
1

MySQL에서 열거 형으로 열을 매핑했습니다. 그러나 (수동으로 생성 된) 테이블 열에 유효하지 않은 항목이 있고 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

데이터베이스를 수정할 수 없으면 잘못된 값으로 null 값을 설정 하시겠습니까? –

+0

수정이 가능하지만 많은 수작업이 필요하며 DB를 사용하는 다른 응용 프로그램을 손상시키지 않아야합니다. 따라서 이러한 예외를 억제하고 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)로 정의했지만 주석이 달린 최대 절전 모드 엔티티에서는 기본적으로 VARCHAR로 정의 된 다음과 같이 정의되었습니다.

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

Postgres의 데이터베이스 정의를 customEnumType의 VARCHAR로 변경했습니다. 또한 다른 유형으로 정의하고 db 수준에서 동일한 변경을 수행하여 열의 메타 데이터를 변경하려고 할 수 있습니다.

간단히 말해, 데이터베이스 테이블 컬럼 정의가 최대 절전 모드가 기대하는 것과 일치하는지 확인하십시오.

관련 문제