java.lang.ClassCastException:无法将java.lang.String强制转换为java.lang.Enum

尝试将实体“ Useraccount”持久存储到数据库表中时出现此错误。

@Entity
@Table(name = "user_account")
public class Useraccount extends BaseEntity {

  @OneToMany(cascade = CascadeType.ALL)
  @JoinColumn(name = "useraccount_id")
  @MapKeyEnumerated(EnumType.STRING)
  private Map<PhoneType,PhoneNumber> phones = new HashMap<PhoneType,PhoneNumber>();

  //... other attributes
  //... default constructor,getters and setters
}
public enum PhoneType {
  HOME("home"),MOBILE("mobile"),FAX("fax"),WORK("work");

  private String value;

  PhoneType(String value) {
     this.value = value;
  }

  @JsonValue
  public String getvalue() {
      return value;
  }
}
@Entity
@Table(name = "phone_number")
public class PhoneNumber extends BaseEntity {

  private String areaCode;
  private String number;

  //... default constructor,getters and setters
}

最后。

public class UseraccountRepository {

    @Inject
    EntityManager entityManager;

    @Override
    public Useraccount save(Useraccount useraccount) {
        if (useraccount.getId() == null) {
            entityManager.persist(useraccount);
        } else {
            useraccount = entityManager.merge(useraccount);
        }
        return useraccount;
    }

  //.. other methods
}
Caused by: java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Enum
    at org.eclipse.persistence.mappings.converters.EnumTypeConverter.convertObjectvalueToDataValue(EnumTypeConverter.java:165)
    at org.eclipse.persistence.mappings.foundation.AbstractDirectMapping.extractIdentityFieldsForQuery(AbstractDirectMapping.java:568)
    at org.eclipse.persistence.internal.queries.MappedKeyMapContainerPolicy.getKeyMappingDataForWriteQuery(MappedKeyMapContainerPolicy.java:145)
    at org.eclipse.persistence.mappings.OneToManyMapping.updatetargetRowPostInsertsource(OneToManyMapping.java:1425)
    at org.eclipse.persistence.mappings.OneToManyMapping.performDataModificationEvent(OneToManyMapping.java:936)
    at org.eclipse.persistence.internal.sessions.CommitManager.commitAllObjectsWithChangeSet(CommitManager.java:162)
    at org.eclipse.persistence.internal.sessions.AbstractSession.writeAllObjectsWithChangeSet(AbstractSession.java:4387)
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitToDatabase(UnitOfWorkImpl.java:1493)
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitToDatabaseWithChangeSet(UnitOfWorkImpl.java:1583)
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.issueSQLbeforeCompletion(UnitOfWorkImpl.java:3258)
    at org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork.issueSQLbeforeCompletion(RepeatableWriteUnitOfWork.java:357)
    at org.eclipse.persistence.transaction.AbstractSynchronizationListener.beforeCompletion(AbstractSynchronizationListener.java:160)
    at org.eclipse.persistence.transaction.JTASynchronizationListener.beforeCompletion(JTASynchronizationListener.java:70)
    at com.sun.enterprise.transaction.JavaEETransactionImpl.commit(JavaEETransactionImpl.java:452)
    ... 94 more

其他具有相同错误的问题建议在Enum类型的属性上添加@Enumerated(EnumType.STRING),我在电话Map上使用了@MapKeyEnumerated(EnumType.STRING),但仍然看到此错误。有什么线索我错了吗?

如果我没有按照SO指南提出问题,请告诉我,我将予以纠正(因为这是我的第一个问题)。

wupei0327 回答:java.lang.ClassCastException:无法将java.lang.String强制转换为java.lang.Enum

我对PhoneNumber类进行了如下更改

@Entity
@Table(name = "phone_number")
public class PhoneNumber extends BaseEntity {

  private PhoneType type;
  private String areaCode;
  private String number;

  //... default constructor,getters and setters
}

,然后将@MapKey(name = "type")添加到UserAccount中,如下所示。

@OneToMany(cascade = CascadeType.ALL)
    @JoinColumn(name = "useraccount_id")
    @MapKeyEnumerated(EnumType.STRING)
    @MapKey(name = "type")
    private Map<PhoneType,PhoneNumber> phones = new HashMap<PhoneType,PhoneNumber>();

通过这些更改,我现在能够将UserAccount对象成功保存到db表中。

本文链接:https://www.f2er.com/2432356.html

大家都在问