2010-11-04 36 views
2

J'essayer OpenJPA 2.0.1 pour la première fois, et je obtenir:Echec de la tentative de conversion de l'instance en PersistenceCapable. Assurez-vous qu'il a été amélioré

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 "[email protected]" to PersistenceCapable failed. Ensure that it has been enhanced. 
FailedObject: [email protected] 
    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 the OpenJPA docs, je ne devrais pas avoir à tout faire pour obtenir la mise en valeur de base à durée d'exécution:

2.5. Omettre l'enhancer OpenJPA

OpenJPA ne nécessite pas l'exécution de l'enhancer . Si vous n'exécutez pas l'enhancer , OpenJPA reviendra à l'une des alternatives possibles pour le suivi d'état, en fonction de l'environnement d'exécution .

Java 6 classe retransformation:

si vous exécutez votre application dans un environnement Java 6 , OpenJPA tentera de enregistrer dynamiquement un ClassTransformer qui va redéfinir vos classes persistantes à la volée à suivre l'accès aux données persistantes. En outre, OpenJPA créera une sous-classe pour chacune de vos classes persistantes . Lorsque vous exécutez une requête ou que traverse une relation, OpenJPA renvoie une instance de la sous-classe. Cela signifie que l'opérateur instanceof fonctionnera comme prévu, mais que o.getClass() renverra la sous-classe au lieu de la classe que vous avez écrite. Vous n'avez absolument rien à faire pour obtenir ce comportement. OpenJPA détectera automatiquement si l'environnement d'exécution est capable de retransformer la classe Java 6.

Des indices pour expliquer pourquoi cela ne fonctionne pas? Merci beaucoup ...

(points bonus pour la raison pour laquelle l'avertissement openjpa.Id arrive - je mets pas ces biens ...)

Répondre

1

Aha, se avère que la réponse devait passer:

"openjpa.RuntimeUnenhancedClasses" => RuntimeUnenhancedClassesModes.SUPPORTED 

à la carte de configuration. Pourquoi cela n'est pas documenté plus clairement, je ne suis pas sûr ...

+1

Je recommande fortement de ne pas utiliser cette propriété. S'il vous plaît lire http://openjpa.apache.org/entity-enhancement.html pour plus d'informations. – Rick

+0

@Rick: en ce moment, je ne fais que jouer et je ne veux vraiment pas avoir à ajouter une étape de construction entre chaque cycle de compilation/exécution ... –

+0

Je suggère d'utiliser le -javaagent .... Si vous Je cours en éclipse, c'est super facile d'y aller. – Rick