2010-11-22 7 views
5

ich eine Aufzählung in meinem Domain-Modell bin, aber ich bekomme die folgende Fehlermeldung, wenn ich versuche, ein Objekt in die Datenbank zu beharren:Wie ein Objekt beharren, dass eine Aufzählung Feld hat

 
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) 

Dies ist Mein Domänenmodell:

Warum funktioniert die @Enumerated-Annotation nicht, da ich denke, dass sie funktionieren sollte? Und wenn es so funktioniert, wie es soll, wie kann ich es so funktionieren lassen, wie ich jetzt denke, dass es funktioniert? Oder mit anderen Worten: Wie behebe ich ein Objekt mit einem Aufzählungsfeld?

EDIT: Danke für alle Antworten. Das NotEmpty ist zufällig da, ich habe es nicht gesehen. Ich musste viele Mappings machen, also kopierte ich eine Menge Zeug, aber vergaß versehentlich das NotEmpty zu entfernen, als ich von String zu Enum wechselte. Das nächste Mal, wenn ich versuchen werde, mich näher mit dem StackTrace zu beschäftigen, habe ich den NotEmptyValidator total vermisst.

+0

die vollständige Stacktrace anzeigen, bitte. – axtavt

+1

Bitte geben Sie eine SSCCE an. BTW, Enum_WhifFunction folgt nicht Java-Namenskonventionen. Ich empfehle, den Unterstrich loszuwerden. – Puce

+0

Der Stacktrace wurde hinzugefügt. – FinalArt2005

Antwort

4

Das Problem ist der Validator nicht die Zuordnung!

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

Die Annotation @NotEmpty enthält @Size(min = 1) und @Size unterstützt nur String, Sammlung, Karte und Array.

+1

Ersetzen Sie @NotEmpty durch @NotNull – Ralph

0

Es könnte helfen, einen Blick auf Mapping enum types with Hibernate Annotations zu werfen.

Aus dem Beispiel gibt es sieht aus wie Sie haben sollten:

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

Wie ist das, was sie dort zeigen, anders als das, was ich hier habe? Immer noch in meinem Code scheint es nicht zu funktionieren. Ich werde EnumType versuchen.ORDINAL, wenn ich nach Hause komme, um zu sehen, ob das den Trick bringt. Dennoch möchte ich, dass die String-Repräsentationen der enums in der Datenbank sind und keine Zahlen, falls ein Mensch direkt in die Datenbank schaut. – FinalArt2005

0

Offenbar Enum_WhifFunction kann nicht auf einen String gegossen werden. Können Sie den Enum_WhifFunction-Code veröffentlichen?

1

java.lang.ClassCastException: nl.ru.cmbi.pdbeter.core.model.enums.Enum_WhifFunction kann nicht auf java.lang.String gegossen werden bei org.hibernate.validator.NotEmptyValidator.isValid (NotEmptyValidator. java: 36)

@NotEmpty scheint die Quelle des probelem nicht die @Enumerated Anmerkung ...

2

ich denke, wenn Sie @NotEmpty zu @NotNull es funktionieren sollte geändert werden. NotEmpty einen String verwenden, sollte zu:

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

@Enumerated mit String verwenden sollte Enum_WhifFunction.name() wie der gespeicherte db Wert bestehen bleiben, so umgekehrt sollte es Enum_WhifFunction.valuOf(storedValue) tut den String-Wert zurück auf die Aufzählung zu übertragen.

Das Problem tritt wahrscheinlich, weil der Prüfer wahrscheinlich so etwas zu tun versucht:

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;