[ 
https://issues.apache.org/jira/browse/OPENJPA-1804?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12912936#action_12912936
 ] 

Willis Blackburn commented on OPENJPA-1804:
-------------------------------------------

When I don't have RuntimeEnhancedClasses set, I get:

Internal error: This configuration disallows runtime optimization, but the 
following listed types were not enhanced at build time or at class load time 
with a javaagent: (all my classes)

When I set RuntimeEnhancedClasses=supported, the app works (now that I've 
gotten rid of all the mapping problems).  However I do NOT see the info message 
"OpenJPA dynamically loaded the class enhancer" mentioned in the documentation. 
 I'm logging at the debug level.

But there is this message:  "Creating subclass for '[class 
com.signetworks.signs.model.security.Group, class 
com.signetworks.signs.model.addressbook.AddressBook, class 
com.signetworks.signs.model.addressbook.PhoneNumber, class 
com.signetworks.signs.model.addressbook.SnailAddress, class 
com.signetworks.signs.model.security.User, class 
com.signetworks.signs.model.addressbook.EmailAddress, class 
com.signetworks.signs.model.entities.HostName, class 
com.signetworks.signs.model.security.Organization]'. This means that your 
application will be less efficient and will consume more memory than it would 
if you ran the OpenJPA enhancer. Additionally, lazy loading will not be 
available for one-to-one and many-to-one persistent attributes in types using 
field access; they will be loaded eagerly instead."

Oops!

I traced through the InstrumentationFactory class.  Looks like the Java 6 
attach API enhancer is not being loaded because my application is not being 
loaded by the system class loader.  One for the documentation!

Also, I think that even if the system class loader check had passed, the agent 
installation would have failed because the OS X JVM doesn't have a tools.jar.  
Instead the attach API classes are in "classes.jar."

> NPE in MappingInfo.java line 1514
> ---------------------------------
>
>                 Key: OPENJPA-1804
>                 URL: https://issues.apache.org/jira/browse/OPENJPA-1804
>             Project: OpenJPA
>          Issue Type: Bug
>          Components: Enhance, UnenhancedClasses, usability
>    Affects Versions: 2.0.1
>            Reporter: Willis Blackburn
>
> I am encountering a NPE at MappingInfo.java line 1514.  I'm sorry I don't 
> have time to prepare a test case right now.  I'm not even 100% sure what is 
> causing the problem, but it seems to be something like this:
> I have classes Organization, Group, User, and AddressBook.
> Group has a reference (many-to-one) to Organization.
> I'm using field-level access and the Java 6 runtime enhancer.  (NOT the 
> build-time enhancer or the agent.)
> In ManagedClassSubclasser.prepareUnenhancedClasses, the code receives a list 
> of Class objects--the ones in persistence.xml.  They are not in the same 
> order as they are in persistence.xml, but I don't know if that's important.  
> The first one is Group.  During the processing of Group, the code invokes 
> ClassMapping.setTable to set the table name, which is "group_table."  This 
> comes from the @Table annotation of Group.  So far, so good.  Then the code 
> does some additional processing on the relationship mappings of Group, which 
> include the reference to Organization.  During the processing of that 
> relationship, the code calls MappingInfo.mergeJoinColumn.  On line 1367, the 
> method calls rel.getTable.  The "rel" variable points to the ClassMapping for 
> Organization.  Remember that prepareUnenhancedClasses hasn't gotten to 
> Organization yet--it's still working on Group--and so I assume that this 
> Organization mapping was created on-demand.  However, rel.getTable returns 
> null.  The Organization class has a @Table attribute, and I can see that the 
> table name has been loaded in the ClassMappingInfo instance attached to the 
> ClassMapping for Organization, however the table name has not yet been copied 
> from ClassMappingInfo to ClassMapping.  Later, the mergeJoinColumn method 
> attempts to dereference the null table name and generates the NPE.
> Bottom line:  When using the Java 6, runtime enhancer, if class A has a 
> reference to class B, and both classes have @Table annotations (at least), 
> and class A is processed first, then it produces a NPE.

-- 
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