Hibernate的例外:java.lang.IllegalArgumentException异常:

2019-10-18 18:39发布

我已经映射到MySQL数据库列在Java中枚举。 但也有在表列(手动创建),并且这是不是在我用Java创建枚举无效项。 当我尝试加载项我得到下面的异常。 是否有可能当你在数据库中的列中的无效项抑制这种例外,即设置枚举“空”?

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)

Answer 1:

你必须指定此枚举自己的Hibernate类型。 让我们假设你有枚举

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;


Answer 2:

我即使我场被正确地@Enumerated注释类似的问题。

问题是如下 - DDL应用于数据库的模式中定义的列类型是CHARACTER(5),而在带注释休眠实体它被定义缺省如下到VARCHAR。

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

我改变了数据库高清Postgres里成为一个customEnumType VARCHAR。 您也可以尝试通过其定义为某些其他类型的和做的分贝水平相同的变化来改变列的元数据。

概括地说,请确保您的数据库表列定义了匹配Hibernate所期待的东西。



文章来源: Hibernate Exception: java.lang.IllegalArgumentException: Unknown name value [] for enum class