I think I need to declare a mapped-superclass, and then use attribute- overrides in the subclass.

Does anyone know if I can declare a mapped-superclass with all fields declared as transient and then use attribute-override in the subclass for fields I want to map? I would be easier for me to code it that way (and yes I am quite lazy).

-dain

On Feb 12, 2007, at 4:00 PM, Dain Sundstrom wrote:

I have this scenario in my CMP2JPA tool where I have to generate subclasses of CMP1 beans. When the user has an "unknown" primary key or more commonly, when they use the same ejb class for multiple deployments, I have to generate a sub class to either add an extra field, or to differentiate two usages of the same class. So say I have the class "foo.TestBean", like this:

package foo;
public class TestBeanEJB implements EntityBean {
    public Integer KEY_ID;
    public String NAME;
}

I generate a sub class like this:

package openejb.foo;
public class TestBeanEJB implements foo.TestBeanEJB {
}

The entity mappings I use look like this:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"; version="1.0">
    <entity name="TestBean" class="openejb.foo.TestBean">
        <table name="TEST"/>
        <attributes>
            <id name="KEY_ID">
                <column name="ID"/>
            </id>
            <basic name="NAME">
                <column name="NAME"/>
            </basic>
        </attributes>
    </entity>
</entity-mappings>

That all seems good, but when I deploy my bean I get the following exception:

INFO [Thread-10] openjpa.MetaData - Parsing package "openejb.foo.TestBean". TRACE [Thread-10] openjpa.MetaData - An exception occurred while parsing jar:file:/tmp/OpenEJB_Generated_1334.jar!/META-INF/openejb- cmp-generated-orm.xml at location Line: 7, C: 31. This exception has been translated to a SAXException, and will be re-thrown. The original exception is being logged along with this message.
java.lang.NoSuchFieldException: KEY_ID
    at java.lang.Class.getDeclaredField(Class.java:1854)
at org.apache.openjpa.persistence.XMLPersistenceMetaDataParser.parseField (XMLPersistenceMetaDataParser.java:1079) at org.apache.openjpa.persistence.XMLPersistenceMetaDataParser.startId (XMLPersistenceMetaDataParser.java:877) at org.apache.openjpa.persistence.XMLPersistenceMetaDataParser.startClass Element(XMLPersistenceMetaDataParser.java:543) at org.apache.openjpa.lib.meta.CFMetaDataParser.startElement (CFMetaDataParser.java:105) at org.apache.openjpa.lib.meta.XMLMetaDataParser.startElement (XMLMetaDataParser.java:426) at org.apache.xerces.parsers.AbstractSAXParser.startElement (Unknown Source) at org.apache.xerces.impl.xs.XMLSchemaValidator.startElement (Unknown Source) at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanStartElement (Unknown Source) at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl $FragmentContentDispatcher.dispatch(Unknown Source) at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument (Unknown Source) at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) at org.apache.xerces.parsers.DTDConfiguration.parse(Unknown Source)
    at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
    at javax.xml.parsers.SAXParser.parse(SAXParser.java:375)
at org.apache.openjpa.lib.meta.XMLMetaDataParser.parseNewResource (XMLMetaDataParser.java:370) at org.apache.openjpa.lib.meta.XMLMetaDataParser.parse (XMLMetaDataParser.java:312) at org.apache.openjpa.lib.meta.XMLMetaDataParser.parse (XMLMetaDataParser.java:289) at org.apache.openjpa.lib.meta.XMLMetaDataParser.parse (XMLMetaDataParser.java:263) at org.apache.openjpa.persistence.PersistenceMetaDataFactory.parseXML (PersistenceMetaDataFactory.java:229) at org.apache.openjpa.persistence.PersistenceMetaDataFactory.load (PersistenceMetaDataFactory.java:180) at org.apache.openjpa.meta.MetaDataRepository.getMetaDataInternal (MetaDataRepository.java:412) at org.apache.openjpa.meta.MetaDataRepository.getMetaData (MetaDataRepository.java:270) at org.apache.openjpa.enhance.PCEnhancer.<init>(PCEnhancer.java: 187) at org.apache.openjpa.enhance.PCClassFileTransformer.transform (PCClassFileTransformer.java:124) at org.apache.openjpa.persistence.PersistenceProviderImpl $ClassTransformerImpl.transform(PersistenceProviderImpl.java:140) at org.apache.openejb.persistence.PersistenceUnitInfoImpl $PersistenceClassFileTransformer.transform (PersistenceUnitInfoImpl.java:259)

Note: the exception should at least tell us which class had the problem :)

Is there some magic flag for JPA that, I can use to make it look in the super class fields persistent fields?

-dain


Reply via email to