[ 
https://issues.apache.org/jira/browse/OPENJPA-2844?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Michael Wiles updated OPENJPA-2844:
-----------------------------------
    Description: 
It seems that with OPENJPA-2834 I can no longer call getProperties on 
EntityManagerFactory without calling createEntityManager first. AFAICT 
createEntityManager calls the "other" path and actually does initalise the 
BrokerImpl.

If I add the following to the TestGetProperty in persistence-jdbc...
{code:java}
    public void testGetProperties() {
        emf.getProperties();    
    }{code}
 I get an NPE because _conf in BrokerImpl is not initialised because initialise 
in this BrokerImpl has not been called.
{noformat}
java.lang.NullPointerException at 
org.apache.openjpa.kernel.BrokerImpl.getProperties(BrokerImpl.java:792) at 
org.apache.openjpa.kernel.DelegatingBroker.getProperties(DelegatingBroker.java:228)
 at 
org.apache.openjpa.persistence.EntityManagerImpl.getProperties(EntityManagerImpl.java:1967)
 at 
org.apache.openjpa.persistence.EntityManagerFactoryImpl.doCreateEM(EntityManagerFactoryImpl.java:300)
 at 
org.apache.openjpa.persistence.EntityManagerFactoryImpl.getProperties(EntityManagerFactoryImpl.java:122)
 at 
org.apache.openjpa.conf.TestGetProperty.testGetProperties(TestGetProperty.java:48)
 at 
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at 
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
 at 
java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 at 
java.base/java.lang.reflect.Method.invoke(Method.java:566) at 
junit.framework.TestCase.runTest(TestCase.java:176) at 
junit.framework.TestCase.runBare(TestCase.java:141){noformat}
This occurs because the new code for "byPassSynchronizeMappings" mode of 
initialising the broker does not in fact call initialise...

line 280 of EntityManagerFactoryImpl:
{code:java}
Broker broker = byPassSynchronizeMappings ?
 conf.newBrokerInstance(user, pass) :
 _factory.newBroker(user, pass, managed, retainMode, false, cfName, 
cf2Name);{code}
 That conf.newBrokerInstance does not call initialise on the broker so the 
_conf field in BrokerImpl is null - thus the NPE when calling getProperties.

I'm not sure if this is expected behaviour or not in this context.

I picked up the issue when running with Spring and Spring data - this depends 
on the ability to successfully call getProperties before an entity manager has 
been created. The reality is chances are other contexts also depend on this 
ability.

Though maybe what could be possible is to allow the _conf in BrokerImpl to be 
null? OPENJPA-2834 was done to address an issue with startup time as far as I 
can tell, and if we add the initialise to the new path maybe that startup time 
work will be undone? 

 

What sweetens the pot somewhat is that the _conf reference in BrokerImpl points 
to is the JDBCConfigurationImpl which is already present in the 
EntityManagerFactoryImpl... 

I can see that running the newBroker function on the _factory is the long 
startup option so that would not be a solution. 

Problem is that the doCreateEM method actually calls em.getProperties in line 
300 - this call fails as the BrokerImpl.getProperties fails. 

  was:
It seems that with OPENJPA-2834 I can no longer call getProperties on 
EntityManagerFactory without calling createEntityManager first. AFAICT 
createEntityManager calls the "other" path and actually does initalise the 
BrokerImpl.

If I add the following to the TestGetProperty in persistence-jdbc...
{code:java}
    public void testGetProperties() {
        emf.getProperties();    
    }{code}
 I get an NPE because _conf in BrokerImpl is not initialised because initialise 
in this BrokerImpl has not been called.
{noformat}
java.lang.NullPointerException at 
org.apache.openjpa.kernel.BrokerImpl.getProperties(BrokerImpl.java:792) at 
org.apache.openjpa.kernel.DelegatingBroker.getProperties(DelegatingBroker.java:228)
 at 
org.apache.openjpa.persistence.EntityManagerImpl.getProperties(EntityManagerImpl.java:1967)
 at 
org.apache.openjpa.persistence.EntityManagerFactoryImpl.doCreateEM(EntityManagerFactoryImpl.java:300)
 at 
org.apache.openjpa.persistence.EntityManagerFactoryImpl.getProperties(EntityManagerFactoryImpl.java:122)
 at 
org.apache.openjpa.conf.TestGetProperty.testGetProperties(TestGetProperty.java:48)
 at 
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at 
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
 at 
java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 at 
java.base/java.lang.reflect.Method.invoke(Method.java:566) at 
junit.framework.TestCase.runTest(TestCase.java:176) at 
junit.framework.TestCase.runBare(TestCase.java:141){noformat}
This occurs because the new code for "byPassSynchronizeMappings" mode of 
initialising the broker does not in fact call initialise...

line 280 of EntityManagerFactoryImpl:
{code:java}
Broker broker = byPassSynchronizeMappings ?
 conf.newBrokerInstance(user, pass) :
 _factory.newBroker(user, pass, managed, retainMode, false, cfName, 
cf2Name);{code}
 That conf.newBrokerInstance does not call initialise on the broker so the 
_conf field in BrokerImpl is null - thus the NPE when calling getProperties.

I'm not sure if this is expected behaviour or not in this context.

I picked up the issue when running with Spring and Spring data - this depends 
on the ability to successfully call getProperties before an entity manager has 
been created.

 

 


> Unable to call getProperties on EnitityManagerFactory before 
> createEntityManager is called.
> -------------------------------------------------------------------------------------------
>
>                 Key: OPENJPA-2844
>                 URL: https://issues.apache.org/jira/browse/OPENJPA-2844
>             Project: OpenJPA
>          Issue Type: Bug
>          Components: kernel
>    Affects Versions: 3.1.3
>            Reporter: Michael Wiles
>            Priority: Major
>
> It seems that with OPENJPA-2834 I can no longer call getProperties on 
> EntityManagerFactory without calling createEntityManager first. AFAICT 
> createEntityManager calls the "other" path and actually does initalise the 
> BrokerImpl.
> If I add the following to the TestGetProperty in persistence-jdbc...
> {code:java}
>     public void testGetProperties() {
>         emf.getProperties();    
>     }{code}
>  I get an NPE because _conf in BrokerImpl is not initialised because 
> initialise in this BrokerImpl has not been called.
> {noformat}
> java.lang.NullPointerException at 
> org.apache.openjpa.kernel.BrokerImpl.getProperties(BrokerImpl.java:792) at 
> org.apache.openjpa.kernel.DelegatingBroker.getProperties(DelegatingBroker.java:228)
>  at 
> org.apache.openjpa.persistence.EntityManagerImpl.getProperties(EntityManagerImpl.java:1967)
>  at 
> org.apache.openjpa.persistence.EntityManagerFactoryImpl.doCreateEM(EntityManagerFactoryImpl.java:300)
>  at 
> org.apache.openjpa.persistence.EntityManagerFactoryImpl.getProperties(EntityManagerFactoryImpl.java:122)
>  at 
> org.apache.openjpa.conf.TestGetProperty.testGetProperties(TestGetProperty.java:48)
>  at 
> java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native 
> Method) at 
> java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
>  at 
> java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>  at 
> java.base/java.lang.reflect.Method.invoke(Method.java:566) at 
> junit.framework.TestCase.runTest(TestCase.java:176) at 
> junit.framework.TestCase.runBare(TestCase.java:141){noformat}
> This occurs because the new code for "byPassSynchronizeMappings" mode of 
> initialising the broker does not in fact call initialise...
> line 280 of EntityManagerFactoryImpl:
> {code:java}
> Broker broker = byPassSynchronizeMappings ?
>  conf.newBrokerInstance(user, pass) :
>  _factory.newBroker(user, pass, managed, retainMode, false, cfName, 
> cf2Name);{code}
>  That conf.newBrokerInstance does not call initialise on the broker so the 
> _conf field in BrokerImpl is null - thus the NPE when calling getProperties.
> I'm not sure if this is expected behaviour or not in this context.
> I picked up the issue when running with Spring and Spring data - this depends 
> on the ability to successfully call getProperties before an entity manager 
> has been created. The reality is chances are other contexts also depend on 
> this ability.
> Though maybe what could be possible is to allow the _conf in BrokerImpl to be 
> null? OPENJPA-2834 was done to address an issue with startup time as far as I 
> can tell, and if we add the initialise to the new path maybe that startup 
> time work will be undone? 
>  
> What sweetens the pot somewhat is that the _conf reference in BrokerImpl 
> points to is the JDBCConfigurationImpl which is already present in the 
> EntityManagerFactoryImpl... 
> I can see that running the newBroker function on the _factory is the long 
> startup option so that would not be a solution. 
> Problem is that the doCreateEM method actually calls em.getProperties in line 
> 300 - this call fails as the BrokerImpl.getProperties fails. 



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to