Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: AW: [eclipselink-dev] Error in EMQueryJUnitTestSuite.testcreateNativeQueryWithSelectSQL on SAP NetWeaver

Hi Adrian,
Actually, the fix should just like the following:
    public void testcreateNativeQueryWithSelectSQL() throws Exception {
        EntityManager em = createEntityManager();
        try{
            beginTransaction(em);
            Query query1 = em.createNativeQuery("Select * FROM CMP3_CUSTOMER");

            Collection c1 = query1.getResultList();
            assertTrue("getResultList returned null ",c1!=null );

            // this may fail with some drivers
            int result = 0;
            try {
                result = query1.executeUpdate();
            } catch (RuntimeException ex) {
                rollbackTransaction(em);
                closeEntityManager(em);
                em = createEntityManager();

                beginTransaction(em);
                // inside container need to query again inorder to attach em
                query1 = em.createNativeQuery("Select * FROM CMP3_CUSTOMER");
            }
       
            Query query2 = em.createNativeQuery("INSERT INTO CMP3_CUSTOMER (CUST_ID, NAME, CITY, CUST_VERSION) VALUES (1111, NULL, NULL, 1)");
            Query query3 = em.createNativeQuery("DELETE FROM CMP3_CUSTOMER WHERE (CUST_ID=1111)");

            query2.executeUpdate();
            Collection c2 = query1.getResultList();
            assertTrue("getResultList returned null ",c2!=null );
            query3.executeUpdate();
            Collection c3 = query1.getResultList();
            assertTrue("getResultList returned null ",c3!=null );

            assertTrue("Native Select query run with executeUpdate modified "+result+" rows ", result==0 );
            assertTrue("Native Select query gave unexpected result after Native Insert query ", c2.size()==(c1.size()+1) );
            assertTrue("Native Select query gave unexpected result after Native Delete query ", c3.size()==c1.size() );
        }finally{
            try{
                rollbackTransaction(em);
                closeEntityManager(em);
            }catch(Exception ee){}
        }
    }


And I will check in this monring, code reviewed by James.

Thanks,
Kevin

Goerler, Adrian wrote:
Hi Yiping,

  
We did find the test error on other servers, but we haven't had time to fix it yet.
    
hm, this explains why we could not understand how the tests could pass on a different server :-)

Actually, the fix you are proposing does not work on NetWeaver either:

    /*
     * createNativeQuery(string) feature test
     *   tests that Query with Select SQL can be executed using getResultList() after it
     *   has run using executeUpdate()
     */
    public void testcreateNativeQueryWithSelectSQL() throws Exception {
        EntityManager em = createEntityManager();
        try{
            beginTransaction(em);
            Query query1 = em.createNativeQuery("Select * FROM CMP3_CUSTOMER");
            Query query2 = em.createNativeQuery("INSERT INTO CMP3_CUSTOMER (CUST_ID, NAME, CITY, CUST_VERSION) VALUES (1111, NULL, NULL, 1)");
            Query query3 = em.createNativeQuery("DELETE FROM CMP3_CUSTOMER WHERE (CUST_ID=1111)");

            Collection c1 = query1.getResultList();
            assertTrue("getResultList returned null ",c1!=null );

            // this may fail with some drivers
            int result = 0;
            try {
                result = query1.executeUpdate();
            } catch (RuntimeException ex) {
                rollbackTransaction(em);
                closeEntityManager(em);
                em = createEntityManager();
                beginTransaction(em);
            }
        

            query2.executeUpdate();  <----------


Query2 is still associated with the entity manager closed by the rollback.

Actually, I think the issue is the rollback in the catch block. We can just do without it:

    /*
     * createNativeQuery(string) feature test
     *   tests that Query with Select SQL can be executed using getResultList() after it
     *   has run using executeUpdate()
     */
    public void testcreateNativeQueryWithSelectSQL() throws Exception {
        EntityManager em = createEntityManager();
        try{
            beginTransaction(em);
            Query query1 = em.createNativeQuery("Select * FROM CMP3_CUSTOMER");
            Query query2 = em.createNativeQuery("INSERT INTO CMP3_CUSTOMER (CUST_ID, NAME, CITY, CUST_VERSION) VALUES (1111, NULL, NULL, 1)");
            Query query3 = em.createNativeQuery("DELETE FROM CMP3_CUSTOMER WHERE (CUST_ID=1111)");

            Collection c1 = query1.getResultList();
            assertTrue("getResultList returned null ",c1!=null );

            int result = 0;
            try {
                result = query1.executeUpdate();
            } catch (RuntimeException ex) {
                // this may fail with some drivers
            	assertTrue("transaction has been rolled back", isTransactionActive(em));
            }
        

            query2.executeUpdate();

In any case, I am opening a ticket for this issue:

https://bugs.eclipse.org/bugs/show_bug.cgi?id=296340

-Adrian

---
Adrian Görler
SAP AG

Pflichtangaben/Mandatory Disclosure Statements: http://www.sap.com/company/legal/impressum.epx


-----Ursprüngliche Nachricht-----
Von: eclipselink-dev-bounces@xxxxxxxxxxx [mailto:eclipselink-dev-bounces@xxxxxxxxxxx] Im Auftrag von yiping zhao
Gesendet: Donnerstag, 26. November 2009 16:50
An: tom Ware
Cc: Dev mailing list for Eclipse Persistence Services
Betreff: Re: [eclipselink-dev] Error in EMQueryJUnitTestSuite.testcreateNativeQueryWithSelectSQL on SAP NetWeaver

Hi Tom,

We did find the test error on other servers, but we haven't had time to 
fix it yet. so the testcase needs to be fixed like:

// this may fail with some drivers
            int result = 0;
            try {
                result = query1.executeUpdate();
            } catch (RuntimeException ex) {
                rollbackTransaction(em);
                closeEntityManager(em);
                em = createEntityManager();
                beginTransaction(em);
            }

Yiping

On 11/26/2009 10:10 AM, Tom Ware wrote:
  
If the entity manager is transaction scoped, I think Sabine is right.  
The entity manager should be closed when the transaction either 
commits or rolls back.  I wonder why that is not happening on other 
servers.  (you'll notice query1.executeUpdate() is designed to fail)

-Tom

yiping zhao wrote:
    
Hi Sabine,

In the test framework, by default the entity manager is injected in 
sessionbean, it's transaction-scoped.

 >From the stacktrace, it looks like that there is issue when 
executing "result = query1.executeUpdate();", then somehow your SAP 
NetWeaver application server closes the entity manager, after that 
you get the exception "java.lang.IllegalStateException: Attempting to 
execute an operation on a closed EntityManager" when executing 
"query2.executeUpdate();", so this sounds like a server issue.

Yiping

On 11/26/2009 4:34 AM, Heider, Sabine wrote:
      
Hi Tom,

I'm not really familiar with the details of test framework either, 
but I guess the entity manager is taken from the TestRunnerBean:

@Stateless(name="TestRunner", mappedName="TestRunner")
@Remote(TestRunner.class)
@TransactionManagement(TransactionManagementType.BEAN)
public class TestRunnerBean implements TestRunner {
        /** The entity manager for the test is injected and passed 
to the test server platform. */
    @PersistenceContext
    private EntityManager entityManager;

    /** The entity manager factory for the test is injected and 
passed to the test server platform. */
    @PersistenceUnit
    private EntityManagerFactory entityManagerFactory;

So yes, it is transaction-scoped.
Best regards,
Sabine

-----Original Message-----
From: eclipselink-dev-bounces@xxxxxxxxxxx 
[mailto:eclipselink-dev-bounces@xxxxxxxxxxx] On Behalf Of Tom Ware
Sent: Mittwoch, 25. November 2009 14:07
To: Dev mailing list for Eclipse Persistence Services
Subject: Re: [eclipselink-dev] Error in 
EMQueryJUnitTestSuite.testcreateNativeQueryWithSelectSQL on SAP 
NetWeaver

Hi Sabine,

   I am not familiar with how the entity manager for the tests are 
created.  The part of the spec you are referring to is for 
Transaction-scoped entity managers.   Is the entity manager used in 
this test created in such a way that it will be transaction-scoped 
on all servers?

-Tom

Heider, Sabine wrote:
 
        
Hi,
 
I'd like to get your opinion on an error I get when running the JPA 
server tests inside an SAP NetWeaver application server (stack 
shortened, executed on current trunk):
 
java.lang.IllegalStateException: Attempting to execute an operation 
on a closed EntityManager.
at 
org.eclipse.persistence.internal.jpa.EntityManagerImpl.verifyOpen(EntityManagerImpl.java:1516) 

at 
org.eclipse.persistence.internal.jpa.EJBQueryImpl.executeUpdate(EJBQueryImpl.java:492) 

at 
org.eclipse.persistence.testing.tests.jpa.relationships.EMQueryJUnitTestSuite.testcreateNativeQueryWithSelectSQL(EMQueryJUnitTestSuite.java:121) 

at 
org.eclipse.persistence.testing.framework.junit.JUnitTestCase.runBareServer(JUnitTestCase.java:463) 

at 
org.eclipse.persistence.testing.framework.server.TestRunnerBean.runTest(TestRunnerBean.java:87) 

 
I run the test against a MySQL database. The MySQL driver throws an 
SQLException in EMQueryJUnitTestSuite line 114: Can not issue 
executeUpdate() for SELECTs.
Consequently, I end up in the catch block where the current 
transaction is rolled back.
 
Chapter 7.9.1 of the JPA specification says:
"After the JTA transaction has completed (either by transaction 
commit or rollback), The container
closes the entity manager by calling EntityManager.close."
 
Apparently, this is what the JPA container in NetWeaver does. With 
the closed entity manager, however, query2 becomes unusable.
 
In my opinion, it's an error of the test rather than of the JPA 
container, but I might be wrong. What do you think?
 
Thanks and best regards,
Sabine
 
*Sabine Heider
**SAP AG

*Pflichtangaben/Mandatory Disclosure Statements:
_http://www.sap.com/company/legal/impressum.epx_
 
 
 


------------------------------------------------------------------------ 


_______________________________________________
eclipselink-dev mailing list
eclipselink-dev@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/eclipselink-dev
    
          
_______________________________________________
eclipselink-dev mailing list
eclipselink-dev@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/eclipselink-dev
_______________________________________________
eclipselink-dev mailing list
eclipselink-dev@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/eclipselink-dev
  
        
------------------------------------------------------------------------

_______________________________________________
eclipselink-dev mailing list
eclipselink-dev@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/eclipselink-dev
      
_______________________________________________
eclipselink-dev mailing list
eclipselink-dev@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/eclipselink-dev
    
_______________________________________________
eclipselink-dev mailing list
eclipselink-dev@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/eclipselink-dev
_______________________________________________
eclipselink-dev mailing list
eclipselink-dev@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/eclipselink-dev
  


Back to the top