Tentative d'instance de casting à PersistenceCapable a échoué. Assurez-vous qu'il a été amélioré
Question
Je suis en train à OpenJPA 2.0.1 pour la première fois, et je reçois:
79 WARN [main] openjpa.Runtime - The configuration property named "openjpa.Id" was not recognized and will be ignored, although the name closely matches a valid property called "openjpa.Id".
179 INFO [main] openjpa.Runtime - Starting OpenJPA 2.0.1
371 INFO [main] openjpa.jdbc.JDBC - Using dictionary class "org.apache.openjpa.jdbc.sql.PostgresDictionary" (PostgreSQL 8.4.4 ,PostgreSQL Native Driver PostgreSQL 9.0 JDBC4 (build 801)).
<openjpa-2.0.1-r422266:989424 nonfatal user error> org.apache.openjpa.persistence.ArgumentException: Attempt to cast instance "x.quality.QualityQuery@4c4b11e9" to PersistenceCapable failed. Ensure that it has been enhanced.
FailedObject: x.quality.QualityQuery@4c4b11e9
at org.apache.openjpa.kernel.BrokerImpl.assertPersistenceCapable(BrokerImpl.java:4559)
at org.apache.openjpa.kernel.BrokerImpl.persist(BrokerImpl.java:2561)
at org.apache.openjpa.kernel.BrokerImpl.persist(BrokerImpl.java:2423)
at org.apache.openjpa.kernel.DelegatingBroker.persist(DelegatingBroker.java:1069)
at org.apache.openjpa.persistence.EntityManagerImpl.persist(EntityManagerImpl.java:706)
at ...
Selon les docs OpenJPA , je ne devrais pas avoir à tout faire pour obtenir la mise en valeur de base lors de l'exécution:
2,5. L'omission de l'amplificateur OpenJPA
OpenJPA ne nécessite pas que le enhancer être exécuté. Si vous ne courez pas le activateur, OpenJPA retombera à l'une de plusieurs alternatives possibles pour le suivi de l'état, en fonction de la l'environnement d'exécution.
Java 6 classe retransformation:
si vous exécutez votre application dans Java 6 environnement, OpenJPA tentera de enregistrer dynamiquement une ClassTransformer qui redéfinira vos classes persistantes à la volée à suivre l'accès aux données persistantes. En outre, OpenJPA va créer un sous-classe pour chacun de vos persistants Des classes. Lorsque vous exécutez une requête ou traverser une relation, OpenJPA volonté retourner une instance de la sous-classe. Cela signifie que le instanceof opérateur fonctionnera comme prévu, mais o.getClass () retourne la sous-classe au lieu de la classe que vous avez écrit. Vous ne devez rien faire du tout pour obtenir ce comportement. volonté OpenJPA détecter automatiquement si oui ou non l'environnement d'exécution est capable de Java 6 classe retransformation.
Les indices pourquoi cela ne fonctionne pas? Merci beaucoup ...
(points bonus pour la raison pour laquelle l'avertissement openjpa.Id arrive - je n'ai pas mis ces biens ...)
La solution
Aha, se trouve que la réponse devait passer dans:
"openjpa.RuntimeUnenhancedClasses" => RuntimeUnenhancedClassesModes.SUPPORTED
à la carte de configuration. Pourquoi est-ce pas documenté plus clairement, je ne suis pas sûr ...