Santosh kumar created OLINGO-971:
------------------------------------

             Summary: Issue with Container Managed Persistence in Olingo 
library V2.0
                 Key: OLINGO-971
                 URL: https://issues.apache.org/jira/browse/OLINGO-971
             Project: Olingo
          Issue Type: Bug
          Components: odata2-jpa
    Affects Versions: V2 2.0.6
         Environment: Hana Cloud Platform, JDK 1.7.
            Reporter: Santosh kumar
            Priority: Blocker


We are working on a Java application that uses Container Managed Persistence in 
Olingo Odata 2 library.
Below are the steps we have followed:
* Defined JTA as transaction type in persistence.xml along with jta-data-source 
element.
* Created a custom class JpaServiceFactory that extends Olingo libraries 
ODataJPAServiceFactory (from olingo-odata2-jpa-processor module).
* Injected EntityManager into JpaServiceFactory using JNDI lookup( Also defined 
persistence context in  web.xml using <persistence-context-ref> tag).
*Note* : we can't use @PersistenceContext to inject Entitymanger beacause 
JpaServiceFactory is not container managed object.
* we then set the above EntityManager to oDataJPAContext of 
ODataJPAServiceFactory.
*Note* : We are not setting EMF to oDataJPAContext, since, we are using 
Container managed persistence.
* When we test the application after these changes, we get *EntityManager not 
initialized*  exception. Upon investigation we found out that the error is due 
to the validation check in Olingo class ODataJPAServiceFactory in the method 
validatePreConditions:
{code:title=ODataJPAServiceFactory.java|borderStyle=solid}
private void validatePreConditions() throws ODataJPARuntimeException {
    if (oDataJPAContext.getEntityManagerFactory() == null) {
      throw 
ODataJPARuntimeException.throwException(ODataJPARuntimeException.ENTITY_MANAGER_NOT_INITIALIZED,
 null);
    }
{code}
* As a mitigation we created a copy of Olingo's ODataJPAServiceFactory class 
and removed the above method.Modified our JpaServiceFactory class to extend the 
custom class created of ODataJPAServiceFactory instead of direclty extending 
ODataJPAServiceFactory.
* Also we have followed the steps mentioned by Chandan here: [JTA based 
transactions in JPA processor|https://issues.apache.org/jira/browse/OLINGO-580].
* After this when tested, we get below exception:
 bq. java.lang.NullPointerException: while trying to invoke the method 
javax.persistence.EntityManagerFactory.getMetamodel() of a null object returned 
from 
*org.apache.olingo.odata2.jpa.processor.api.ODataJPAContext.getEntityManagerFactory()*at
 
org.apache.olingo.odata2.jpa.processor.core.model.JPAEdmBaseViewImpl.<init>(JPAEdmBaseViewImpl.java:50)
 at 
org.apache.olingo.odata2.jpa.processor.core.model.JPAEdmModel.<init>(JPAEdmModel.java:39)
As we can see from the stack trace above, the library class 
JPAEdmBaseViewImpl.java again tries to retrieve EntityManagerFactory object 
which is null for CMP.
{color:red}
This is bug in Olingo code. Because, for a Container managed persistence when 
we set EntityManager in oDataJPAContext, the framework shouldn't throw error 
for null EMF.
{color}

Can anyone look into this issue ?





--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to