Java 如何持久化具有枚举字段的对象

Java 如何持久化具有枚举字段的对象,java,hibernate,persistence,enumeration,Java,Hibernate,Persistence,Enumeration,我正在域模型中使用枚举,但在尝试将对象持久化到数据库时出现以下错误: Exception in thread "main" java.lang.ClassCastException: nl.ru.cmbi.pdbeter.core.model.enums.Enum_WhifFunction cannot be cast to java.lang.String at org.hibernate.validator.NotEmptyValidator.isValid(NotEmptyVali

我正在域模型中使用枚举,但在尝试将对象持久化到数据库时出现以下错误:

Exception in thread "main" java.lang.ClassCastException: nl.ru.cmbi.pdbeter.core.model.enums.Enum_WhifFunction cannot be cast to java.lang.String at org.hibernate.validator.NotEmptyValidator.isValid(NotEmptyValidator.java:36) at org.hibernate.validator.ClassValidator.getInvalidValues(ClassValidator.java:386) at org.hibernate.validator.ClassValidator.getInvalidValues(ClassValidator.java:352) at org.hibernate.validator.event.ValidateEventListener.validate(ValidateEventListener.java:139) at org.hibernate.validator.event.ValidateEventListener.onPreInsert(ValidateEventListener.java:172) at org.hibernate.action.EntityIdentityInsertAction.preInsert(EntityIdentityInsertAction.java:142) at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:65) at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:279) at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:321) at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:204) at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:130) at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210) at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195) at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:117) at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93) at org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:535) at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:527) at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:523) at nl.ru.cmbi.pdbeter.core.controller.DAO.GenericDAO.makePersistent(GenericDAO.java:73) at nl.ru.cmbi.pdbeter.core.controller.DAO.WhifFunctionDAO.getWhifFunctionSet(WhifFunctionDAO.java:36) at nl.ru.cmbi.pdbeter.core.controller.DAO.LoggedErrorWhifDAO.updateWhifFunctionSet(LoggedErrorWhifDAO.java:42) at nl.ru.cmbi.pdbeter.whifclient.controller.WhifFunctionsUpdater.executeWhifFunctionsByAccessionCode(WhifFunctionsUpdater.java:93) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:616) at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:309) at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202) at $Proxy31.executeWhifFunctionsByAccessionCode(Unknown Source) at nl.ru.cmbi.pdbeter.whifclient.controller.WhifFunctionsExecutor.executeWhifFunctions(WhifFunctionsExecutor.java:26) at nl.ru.cmbi.pdbeter.whifclient.controller.WhifClient.updateWhifFunctions(WhifClient.java:22) at nl.ru.cmbi.pdbeter.updater.controller.UpdaterMain.start(UpdaterMain.java:65) at nl.ru.cmbi.pdbeter.updater.controller.UpdaterMain.main(UpdaterMain.java:44) 线程“main”java.lang.ClassCastException中的异常:nl.ru.cmbi.pdbeter.core.model.enums.Enum_whiff函数不能转换为java.lang.String 位于org.hibernate.validator.NotEmptyValidator.isValid(NotEmptyValidator.java:36) 位于org.hibernate.validator.ClassValidator.getInvalidValues(ClassValidator.java:386) 位于org.hibernate.validator.ClassValidator.getInvalidValues(ClassValidator.java:352) 位于org.hibernate.validator.event.ValidateEventListener.validate(ValidateEventListener.java:139) 位于org.hibernate.validator.event.ValidateEventListener.onPreInsert(ValidateEventListener.java:172) 在org.hibernate.action.EntityIdentityInsertAction.preInsert(EntityIdentityInsertAction.java:142) 在org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:65) 位于org.hibernate.engine.ActionQueue.execute(ActionQueue.java:279) 位于org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:321) 位于org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:204) 位于org.hibernate.event.def.AbstractSaveEventListener.SaveWithGenerateId(AbstractSaveEventListener.java:130) 在org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210) 位于org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195) 位于org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:117) 位于org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93) 位于org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:535) 位于org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:527) 位于org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:523) 位于nl.ru.cmbi.pdbeter.core.controller.DAO.GenericDAO.makePersistent(GenericDAO.java:73) 位于nl.ru.cmbi.pdbeter.core.controller.DAO.WhifFunctionDAO.getWhifFunctionSet(WhifFunctionDAO.java:36) 位于nl.ru.cmbi.pdbeter.core.controller.DAO.LoggedErrorWhifDAO.updateWhifFunctionSet(LoggedErrorWhifDAO.java:42) 位于nl.ru.cmbi.pdbeter.whifclient.controller.WhifFunctionsUpdater.executeWhifFunctionsByAccessionCode(WhifFunctionsUpdater.java:93) 在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处 在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)中 在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中 位于java.lang.reflect.Method.invoke(Method.java:616) 位于org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:309) 位于org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183) 在org.springframework.aop.framework.ReflectiveMethodInvocation.procedue(ReflectiveMethodInvocation.java:150)上 位于org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110) 位于org.springframework.aop.framework.ReflectiveMethodInvocation.procedue(ReflectiveMethodInvocation.java:172) 位于org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202) 在$Proxy31处。ExecuteWhiffFunctionsByAccessionCode(未知源) 位于nl.ru.cmbi.pdbeter.whifclient.controller.whiffunctionseecutor.executeWhifFunctions(whiffunctionseecutor.java:26) 位于nl.ru.cmbi.pdbeter.whifclient.controller.whifclient.updateWhifFunctions(whifclient.java:22) 在nl.ru.cmbi.pdbeter.updater.controller.UpdaterMain.start(UpdaterMain.java:65) 位于nl.ru.cmbi.pdbeter.updater.controller.UpdaterMain.main(UpdaterMain.java:44) 这是我的域模型:

package nl.ru.cmbi.pdbeter.core.model.domain;

import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.ManyToMany;

import lombok.AccessLevel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;

import nl.ru.cmbi.pdbeter.core.model.enums.Enum_WhifFunction;

import org.hibernate.annotations.NaturalId;
import org.hibernate.validator.NotEmpty;

@Entity
@Data
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@EqualsAndHashCode(callSuper = false, of = { "whifFunction" })
@SuppressWarnings("PMD.UnusedPrivateField")
public class WhifFunction extends DomainObject implements Serializable {
    @NaturalId
    @NotEmpty
    @Enumerated(EnumType.STRING)
    private Enum_WhifFunction           whifFunction;

    @ManyToMany(mappedBy = "whifFunctionSet", cascade = CascadeType.ALL)
    private Set<LoggedErrorWhif> loggedErrorWhifSet = new HashSet<LoggedErrorWhif>();

    public WhifFunction(Enum_WhifFunction whifFunction) {
        if (whifFunction == null) {
            throw new IllegalStateException("WhifFunction is null");
        } else {
            this.whifFunction = whifFunction;
        }
    }

    @Override
    public String toString() {
        return whifFunction.toString();
    }
}
包nl.ru.cmbi.pdbeter.core.model.domain;
导入java.io.Serializable;
导入java.util.HashSet;
导入java.util.Set;
导入javax.persistence.CascadeType;
导入javax.persistence.Entity;
导入javax.persistence.EnumType;
导入javax.persistence.Enumerated;
导入javax.persistence.ManyToMany;
导入lombok.AccessLevel;
导入龙目数据;
导入lombok.EqualsAndHashCode;
导入lombok.noargsconstuctor;
导入nl.ru.cmbi.pdbeter.core.model.enums.Enum_WhifFunction;
导入org.hibernate.annotations.d;
导入org.hibernate.validator.NotEmpty;
@实体
@资料
@NoArgsConstructor(access=AccessLevel.PROTECTED)
@EqualsAndHashCode(callSuper=false,of={“whifFunction”})
@SuppressWarnings(“PMD.UnusedPrivateField”)
公共类WhifFunction扩展域对象实现可序列化{
@归化
@空空如也
@枚举(EnumType.STRING)
私有枚举WhifFunction WhifFunction;
@ManyToMany(mappedBy=“whifFunctionSet”,cascade=CascadeType.ALL)
私有集loggedErrorWhifSet=new HashSet();
公共WhifFunction(枚举WhifFunction WhifFunction){
if(whifFunction==null){
抛出新的非法状态异常(“WhifFunction为null”);
}否则{
this.whifFunction=whifFunction;
}
}
@凌驾
公共字符串toString(){
返回whifFunction.toString();
}
}
为什么@Enumerated注释不能像我认为的那样工作?如果它按照预期的方式工作,我如何才能让它按照我现在认为的方式工作?或者换句话说:如何持久化具有枚举字段的对象

编辑: 谢谢你的回答。那张便条是偶然出现的,我没看见。我不得不做很多映射,所以我复制粘贴了很多东西,但当我从字符串更改为枚举时,不小心忘记删除NotEmpty。下一次我将尝试更仔细地查看stacktrace,我
private Enum_WhifFunction           whifFunction;
@Enumerated(EnumType.STRING)
public Enum_WhifFunction getWhifFunction() {
  return this.whifFunction;
}
at org.hibernate.validator.NotEmptyValidator.isValid(NotEmptyValidator.java:36)
string != null && string.trim().length() > 0
Object o = //get field
String toValidate = (String) o; // throws a class cast if o is of type Enum_WhifFunction
return toValidate != null && toValidate.trim().length() > 0;