Kevin,
I just tried this as an example.
Can you please let me know if something wrong in my assumption.
@ManagedInterface
interface Drivable
class FordMushtang implements Drivable
and my persistence.xml
<provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
<class>com.ejb.entity.Drivable</class>
<properties>
<property name="openjpa.RuntimeUnenhancedClasses" value="supported"/>
</properties>
I am getting an exception of
<openjpa-2.0.0-M3-r422266:822833 nonfatal user error>
org.apache.openjpa.persistence.ArgumentException: Attempt to cast instance
"com.ejb.entity.FordMushtang[id=234234234]" to PersistenceCapable failed.
Ensure that it has been enhanced.
FailedObject: com.ejb.entity.FordMushtang[id=234234234]
at
org.apache.openjpa.kernel.BrokerImpl.assertPersistenceCapable(BrokerImpl.java:4480)
at org.apache.openjpa.kernel.BrokerImpl.persist(BrokerImpl.java:2505)
at org.apache.openjpa.kernel.BrokerImpl.persist(BrokerImpl.java:2366)
at
org.apache.openjpa.kernel.DelegatingBroker.persist(DelegatingBroker.java:1039)
at
org.apache.openjpa.persistence.EntityManagerImpl.persist(EntityManagerImpl.java:696)
at jpatesting.Main.persist(Main.java:85)
at jpatesting.Main.main(Main.java:66)
________________________________
From: Kevin Sutter <[email protected]>
To: [email protected]
Sent: Wed, October 28, 2009 8:53:07 AM
Subject: Re: Problems with Interfaces
Hi Gopi,
On Mon, Oct 26, 2009 at 6:10 PM, Gopi <[email protected]> wrote:
>
> > o The @ManagedInterface "instances" are created by the runtime when you
> > call createInstance(c). You should not be defining a separate @Entity
> > class. This is like doubly defining your object model.
> >
> >
>
> Ok. I removed the @Entity from the class. So now in my persistence.xml,
> instead of <class>EndpointObject</class>, I now have
> <class>Endpoint</class>. Is this right?
>
> Yes, that's what I would expect.
>
> > o To that end, your @GeneratedValue should be moved from your Entity
> > class
> > to your ManagedInterface interface.
> >
> >
> Ok. Done.
>
> Good.
> > o And, it looks like you are doing a lot of extra processing with
> > registration with the MetaDataRepository and ClassMetaData. You should
> > not
> > have to mess around with these data structures. After creating the
> > instance
> > and persisting it, the OpenJPA runtime should take care of the
> > registration.
> >
> >
>
> The reason I am doing the extra processing is because, if I don't, I get
> the
> following error message. I found a solution to this in this forum at
>
> http://n2.nabble.com/Problem-using-OpenJPAEntityManager-createInstance-td1493116.html
>
> [java] java.lang.IllegalArgumentException: No metadata was found for
> managed interface Endpoint.
> [java] at
> org.apache.openjpa.kernel.BrokerImpl.newInstance(BrokerImpl.java:4319)
> [java] at
>
> org.apache.openjpa.kernel.DelegatingBroker.newInstance(DelegatingBroker.java:1392)
> [java] at
>
> org.apache.openjpa.persistence.EntityManagerImpl.createInstance(EntityManagerImpl.java:1243)
> [java] at Main.main(Main.java:36)
>
> So how else do I get rid of this error message?
>
According to that post, this extra processing should not be necessary if you
have included the ManagedInterface "entity" in the <class> element of
persistence.xml. So, even with the changes you did above, you are still
getting this exception?
>From Pinaki's response...
"The metadata registration and classloading done in your code for
managed interface *should* not be required if you specify the class name in
<class> clause of persistence.xml. But please report if that is not the
case."
>
> > o One additional thought is how are you performing the enhancement
> > processing [2]? To be honest, I'm not entirely clear on how the
> > @ManagedInterface instance creation integrates with our enhancement
> > processing. Maybe another developer can shed some light on this aspect.
> >
> >
>
> I am doing this by passing an arg to the jvm as follows in my build.xml
> file.
>
> <target name="Main">
> <java classname="Main" failonerror="true" fork="yes">
> <jvmarg
> value="-javaagent:/Users/gopi/packages/openjpa/openjpa-all-2.0.0-M3.jar" />
> <classpath refid="TestJPA1.classpath" />
> </java>
> </target>
>
If you are only using @ManagedInterfaces and no other @Entities, then this
should not even be required. Pinaki's other reply on this thread has
indicated that due to the generated byte-codes that we do for the
@ManagedInterface instance creation, all of the enhancement processing is
already done. But, if you have other @Entities, then the use of the
-javaagent is an easy way to get your Entities enhanced.
Kevin
> --
> View this message in context:
> http://n2.nabble.com/Problems-with-Interfaces-tp3894934p3895651.html
> Sent from the OpenJPA Users mailing list archive at Nabble.com.
>