java - Hibernate 异常 : java. lang.IllegalArgumentException:枚举类的未知名称值 []

标签 java mysql hibernate enums hibernate-mapping

我已将 Mysql 数据库中的列映射到 java 中的枚举。但是表列中有无效条目(手动创建)并且不在我在 java 中创建的枚举中。当我尝试加载条目时,出现以下异常。当数据库的列中有无效条目时,是否可以抑制此异常,即将枚举设置为“null”?

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)

最佳答案

您必须为此枚举指定您自己的 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;

关于java - Hibernate 异常 : java. lang.IllegalArgumentException:枚举类的未知名称值 [],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19449334/

相关文章:

java - 为什么我的 Swing GUI 没有显示所有添加的按钮?

mysql - SQL查询性能-单条记录,按非索引列过滤,按索引列排序,记录在排序记录的序列中接近

java - 如何使用 @ID 和 @GenerateValue 从 Hibernate + JPA 中的序列获取 Oracle 生成值

java - 使用 HibernateTemplate 时无法获取列名称

java - 循环不起作用。找不到语义错误

java - 使用Java代码创建Hibernate表索引

java - 如何为这个 Kotlin 类属性使用 setter?

php - 自从从 mysql 更新到 mysqli 以来数据库查询被破坏

php - 对 null 调用成员函数 query();使用 PDO

java - Java hibernate中如何转换列表类型