2010-11-22 210 views
5

我用我的域模型的枚举枚举场中的目标,但我得到以下错误,当我试图坚持对象到数据库:如何坚持有

 
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) 

这是我的域名模型:

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(); 
    } 
} 

为什么不是@Enumerated注释工作,因为我认为它应该工作?如果它按照预期的方式工作,那我该如何让它按我现在认为正在工作的方式工作?或换句话说:如何持久化一个枚举字段的对象。

编辑: 感谢您的所有答案。 NotEmpty在那里是偶然的,我没有看到它。我不得不做很多映射,所以我复制粘贴了很多东西,但是当我从字符串更改为枚举时,意外忘记删除NotEmpty。下次我会试着更仔细地看一下堆栈跟踪,我完全错过了NotEmptyValidator。

+0

显示完整的堆栈跟踪,请。 – axtavt 2010-11-22 16:20:09

+1

请提供一个SSCCE。顺便提一下,Enum_WhifFunction不遵循Java命名约定。我建议摆脱下划线。 – Puce 2010-11-22 16:26:30

+0

添加了堆栈跟踪。 – FinalArt2005 2010-11-22 16:31:09

回答

4

问题是验证器不是映射!

at org.hibernate.validator.NotEmptyValidator.isValid(NotEmptyValidator.java:36) 

诠释@NotEmpty包含@Size(min = 1)@Size仅支持字符串,收集,地图和数组。

0

这可能有助于看看Mapping enum types with Hibernate Annotations

从例子中有它看起来像你应该有:

private Enum_WhifFunction   whifFunction; 
@Enumerated(EnumType.STRING) 
public Enum_WhifFunction getWhifFunction() { 
    return this.whifFunction; 
} 
0

显然Enum_WhifFunction不能转换为字符串。 你能发布Enum_WhifFunction代码吗?

1

java.lang.ClassCastException:nl.ru.cmbi.pdbeter.core.model.enums.Enum_WhifFunction不能org.hibernate.validator.NotEmptyValidator.isValid(NotEmptyValidator被转换为java.lang.String 。 Java的:36)

@NotEmpty似乎是probelem不是@Enumerated注释的源...

2

我认为,如果你改变@NotEmpty@NotNull它应该工作。 NotEmpty使用字符串应该等同于:

string != null && string.trim().length() > 0 

使用@Enumerated与字符串应该坚持Enum_WhifFunction.name()作为存储分贝值,所以反过来它应该做的Enum_WhifFunction.valuOf(storedValue)字符串值回传给枚举。

的问题有可能发生的验证器可能试图做这样的事情:

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;