Skip to main content

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

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


Back to the top