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
|