首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >java.lang.ClassCastException: java.lang.String不能强制转换为java.lang.Enum

java.lang.ClassCastException: java.lang.String不能强制转换为java.lang.Enum
EN

Stack Overflow用户
提问于 2020-04-16 07:44:28
回答 1查看 792关注 0票数 0

当我试图将一个实体'UserAccount‘持久化到数据库表中时,我得到了这个错误。

代码语言:javascript
复制
@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
}
代码语言:javascript
复制
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;
  }
}
代码语言:javascript
复制
@Entity
@Table(name = "phone_number")
public class PhoneNumber extends BaseEntity {

  private String areaCode;
  private String number;

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

最后..。

代码语言:javascript
复制
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
}
代码语言:javascript
复制
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

其他有相同错误的问题建议在枚举类型的属性上添加@Enumerated(EnumType.STRING),我已经在电话地图上使用了@MapKeyEnumerated(EnumType.STRING),但我仍然看到get this error。有什么线索我哪里错了吗?

请让我知道,如果我没有按照SO指导提出问题,我会纠正它(因为这是我的第一个问题)。

EN

回答 1

Stack Overflow用户

发布于 2020-04-16 17:10:40

我对PhoneNumber类进行了更改,如下所示

代码语言:javascript
复制
@Entity
@Table(name = "phone_number")
public class PhoneNumber extends BaseEntity {

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

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

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

代码语言:javascript
复制
@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表中。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61240413

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档