[ 
https://issues.apache.org/jira/browse/OPENJPA-146?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12473911
 ] 

Gokhan Ergul commented on OPENJPA-146:
--------------------------------------

Alright, it did manifest itself in a different way as you guessed:

java.lang.NullPointerException
        at 
org.apache.openjpa.jdbc.meta.strats.EmbedValueHandler.map(EmbedValueHandler.java:50)
        at 
org.apache.openjpa.jdbc.meta.strats.ObjectIdValueHandler.map(ObjectIdValueHandler.java:46)
        at 
org.apache.openjpa.jdbc.meta.strats.HandlerStrategies.map(HandlerStrategies.java:56)
        at 
org.apache.openjpa.jdbc.meta.strats.HandlerFieldStrategy.map(HandlerFieldStrategy.java:77)
        at 
org.apache.openjpa.jdbc.meta.FieldMapping.setStrategy(FieldMapping.java:117)
...

Bit of debugging into the code:

(EmbedValueHandler.java) 
    protected void map(ValueMapping vm, String name, ColumnIO io,
        boolean adapt, List cols, List args) {
        // have to resolve embedded value to collect its columns
        vm.getEmbeddedMapping().resolve(vm.MODE_META | vm.MODE_MAPPING);
...

vm .getEmbeddedMapping() returns null, since:

(ValueMetaDataImpl.java)
    public ClassMetaData getEmbeddedMetaData() {
        if (_embeddedMeta == null && isEmbeddedPC())
            addEmbeddedMetaData();
        return _embeddedMeta;
    }

and

    public boolean isEmbeddedPC() {
        return _decCode == JavaTypes.PC && isEmbedded();
    }

_decCode is JavaTypes.OID. 

JavaTypes.PC was possibly overwritten by:

    public boolean resolve(int mode) {
...
        // oid as primary key field?
        if (_decCode == JavaTypes.PC && isEmbedded()
            && _owner.isPrimaryKey() && _owner.getValue() == this)
            _code = _decCode = JavaTypes.OID; 

So I've changed

    public boolean isEmbeddedPC() {
        return _decCode == JavaTypes.PC && isEmbedded();
    }

to 

    public boolean isEmbeddedPC() {
        return (_decCode == JavaTypes.PC || _decCode == JavaTypes.OID) && 
isEmbedded();
    }

seems to have fixed the problem, tho I'm not sure if it has any nasty 
sideeffects.

Any comments?


> Entity enhancement fails while using EmbeddedId on a MappedSuperclass
> ---------------------------------------------------------------------
>
>                 Key: OPENJPA-146
>                 URL: https://issues.apache.org/jira/browse/OPENJPA-146
>             Project: OpenJPA
>          Issue Type: Bug
>          Components: kernel
>         Environment: openjpa 0.9.6
>            Reporter: Gokhan Ergul
>         Attachments: test-case.zip
>
>
> Both buildtime and runtime class enhancement fail with the following error:
> ...
> 1339  TRACE  [main] openjpa.Enhance - Enhancing type "class test.B".
> Exception in thread "main" <0|false|0.9.6-incubating> 
> org.apache.openjpa.util.GeneralException: null
>         at org.apache.openjpa.enhance.PCEnhancer.run(PCEnhancer.java:350)
>         at org.apache.openjpa.enhance.PCEnhancer.run(PCEnhancer.java:3711)
>         at org.apache.openjpa.enhance.PCEnhancer.run(PCEnhancer.java:3661)
>         at org.apache.openjpa.enhance.PCEnhancer.main(PCEnhancer.java:3633)
> Caused by: java.lang.NullPointerException
>         at 
> org.apache.openjpa.enhance.PCEnhancer.enhanceObjectId(PCEnhancer.java:2745)
>         at org.apache.openjpa.enhance.PCEnhancer.run(PCEnhancer.java:338)
>         ... 3 more
> Test code as follows:
> test/A.java:
> --------------
> package test;
> import javax.persistence.*;
> import java.io.Serializable;
> @MappedSuperclass
> abstract public class A {
>     @Embeddable
>     public static class A_PK implements Serializable {
>         @Basic
>         protected int id1;
>         
>         @Basic
>         protected String id2;
>         
>         public boolean equals (Object other) {
>             return false;
>         }
>         public int hashCode () {
>             return 0;
>         }
>     }
>     @EmbeddedId
>     protected A_PK pk;
>     @Basic
>     protected String val;
> }
> --------------
> test/B.java:
> --------------
> package test;
> import javax.persistence.Entity;
> @Entity
> public class B extends A {
> }
> --------------
> META-INF/persistence.xml:
> --------------
> <persistence xmlns="http://java.sun.com/xml/ns/persistence";
>         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
>         xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm 
> http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd";
>         version="1.0">
>     <persistence-unit name="TestService" transaction-type="RESOURCE_LOCAL">
>         <class>test.A$A_PK</class>
>         <class>test.A</class>
>         <class>test.B</class>
>         <properties>
>             <property name="openjpa.Log" value="DefaultLevel=TRACE"/>
>             <property name="openjpa.ConnectionUserName" value="test"/>
>             <property name="openjpa.ConnectionPassword" value="test"/>
>             <property name="openjpa.ConnectionURL" 
> value="jdbc:mysql://localhost:3306/oam?useServerPrepStmts=false"/>
>             <property name="openjpa.ConnectionDriverName" 
> value="com.mysql.jdbc.Driver"/>
>         </properties>
>     </persistence-unit>
> </persistence>
> --------------

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to