Return-Path: Delivered-To: apmail-openjpa-users-archive@locus.apache.org Received: (qmail 93248 invoked from network); 6 Jan 2008 22:43:15 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 6 Jan 2008 22:43:15 -0000 Received: (qmail 92792 invoked by uid 500); 6 Jan 2008 22:43:04 -0000 Delivered-To: apmail-openjpa-users-archive@openjpa.apache.org Received: (qmail 92765 invoked by uid 500); 6 Jan 2008 22:43:03 -0000 Mailing-List: contact users-help@openjpa.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: users@openjpa.apache.org Delivered-To: mailing list users@openjpa.apache.org Received: (qmail 92756 invoked by uid 99); 6 Jan 2008 22:43:03 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 06 Jan 2008 14:43:03 -0800 X-ASF-Spam-Status: No, hits=2.0 required=10.0 tests=HTML_MESSAGE,SPF_PASS X-Spam-Check-By: apache.org Received-SPF: pass (athena.apache.org: domain of saintx.opensource@gmail.com designates 64.233.178.243 as permitted sender) Received: from [64.233.178.243] (HELO hs-out-2122.google.com) (64.233.178.243) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 06 Jan 2008 22:42:40 +0000 Received: by hs-out-2122.google.com with SMTP id x43so6336181hsb.9 for ; Sun, 06 Jan 2008 14:42:44 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:message-id:date:from:to:subject:mime-version:content-type; bh=K04fn1DN+A/4VSVKATqpfjtNDyAt8GS74Inq4b770tw=; b=EB1Z7Dl4kKz9nH/M6fC+JzwdrvyOl3gbJmTMDnuh1ZlyCmoI/qzwe+8jwq7RaMG1tp1BkR4RbE1VRxaOtdeGfSi/cqPfs3YeicV8/NnRgAcutZdL4l/kM7TgWCOgOsKs4Qc8oD1L1QD6I/NyWIH9xTG/ajy3qhYAL2R9BqQDYes= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=message-id:date:from:to:subject:mime-version:content-type; b=ltE0Y7kqlkwbSFjN0tZqG2YSLZ1zle0kJo2ZVHAU2N5sgIdDm5toplu8stbu2laStXls/Op/dvq3Ee5pExDJ3hAcYMHWmEuYiqLIhUKOtiQoWq35fGH/CYisod3uf9uta963KF48w9qAXWkx8wj5QY86bMS9z3kJCb/RC5g1ldo= Received: by 10.150.144.9 with SMTP id r9mr3072145ybd.110.1199659364246; Sun, 06 Jan 2008 14:42:44 -0800 (PST) Received: by 10.150.135.14 with HTTP; Sun, 6 Jan 2008 14:42:44 -0800 (PST) Message-ID: Date: Sun, 6 Jan 2008 16:42:44 -0600 From: "Alexander Saint Croix" To: users@openejb.apache.org, users@openjpa.apache.org Subject: Nuking tables on tearDown() for CRUD tests MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_Part_15271_5653502.1199659364233" X-Virus-Checked: Checked by ClamAV on apache.org ------=_Part_15271_5653502.1199659364233 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Content-Disposition: inline Hello, I'm doing CRUD tests on a collection of integrated entities in a shared persistence unit, and am encountering some errors because of crufty tables from previous tests. I'm looking for a means of guaranteeing that the tables for each of my entities is devoid of entries after each test runs. The appropriate place to do this would be in the tearDown() method of the unit test class. My environment is OpenEJB (3.0.0 core, latest snapshot), OpenJPA and an in-memory HSQLDB. OS X on Java 5. At the moment, I've implemented a stateless session bean to manage persistence for me. It's using an injected entity manager to perform a series of DELETE statements. Here's how the EM is set up: @PersistenceContext(unitName = "party-test-unit", type = PersistenceContextType.TRANSACTION) private EntityManager entityManager; I want to stress that I was previously removing entries from the database by getting a list of components of a given class, then iteratively deleting them. This worked just fine, but was very inefficient and slowed down the builds more than was acceptable. My clear() method defines a String[] of table names, then recursively creates a Query("DELETE FROM " + table) for each of the bean class names in the package I'm testing. Here is the code: public void clear() { Set queries = new HashSet(); String[] types = { "Address", "AssociatedAddress", "EmailAddress", "GeographicAddress", "ISOCountryCode", "Locale", "TelecomAddress", "WebPageAddress", "AssignedResponsibility", "Capability", "PartyRelationship", "PartyRelationshipType", "PartyRole", "PartyRoleType", "Responsibility", "Organization", "OrganizationName", "Party", "PartySignature", "Person", "PersonName", "Preference", "PreferenceOption", "PreferenceType", "Property", "RegisteredIdentifier"}; for(String table : types) { queries.add(entityManager.createQuery("DELETE FROM " + table)); } for(Query query : queries) query.executeUpdate(); } This method *usually* works. However, sometimes I get *very* strange nonapplication exceptions that are causing what appear to be intermittent test failures. By intermittent I mean a given unit test method might pass during one "mvn clean build" process, then fail immediately afterward during a second "mvn clean build" process, without any alterations to the source or testing code. This happens on some tests, sometimes, and not on others, other times, and I can discern no clear pattern. One example of the error output is listed at the bottom of this message. So, what I'm really looking for is a performant way to guarantee that my tables are empty between unit tests, so that I'm essentially starting from a completely clean environment. I welcome any suggestions, and will even entertain non-specification compliant mechanisms provided by OpenEJB or OpenJPA to accomplish this. Dain mentioned that I might completely drop and restart OpenEJB between tests. He also mentioned that OpenJPA might have a way to wipe the database tables clean for a given persistence unit. I'm interested in any ideas or feedback about this. Regards, -- Alexander R. Saint Croix As promised, here is the error: ------------------------------------------------------------------------------- Test set: org.eremite.corm.party.PersistenceTest ------------------------------------------------------------------------------- Tests run: 8, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 5.749 sec <<< FAILURE! testPartySignatureAnnotations(org.eremite.corm.party.PersistenceTest) Time elapsed: 0.466 sec <<< ERROR! javax.ejb.EJBException: The bean encountered a non-application exception.; nested exception is: org.apache.openjpa.persistence.PersistenceException: no-saved-fields at org.apache.openejb.core.ivm.BaseEjbProxyHandler.convertException( BaseEjbProxyHandler.java:366) at org.apache.openejb.core.ivm.BaseEjbProxyHandler.invoke( BaseEjbProxyHandler.java:323) at org.apache.openejb.util.proxy.Jdk13InvocationHandler.invoke( Jdk13InvocationHandler.java:49) at $Proxy19.clear(Unknown Source) at org.eremite.corm.party.PersistenceTest.testPartySignatureAnnotations( PersistenceTest.java:189) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke( NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke( DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:585) at junit.framework.TestCase.runTest(TestCase.java:164) at junit.framework.TestCase.runBare(TestCase.java:130) at junit.framework.TestResult$1.protect(TestResult.java:110) at junit.framework.TestResult.runProtected(TestResult.java:128) at junit.framework.TestResult.run(TestResult.java:113) at junit.framework.TestCase.run(TestCase.java:120) at junit.framework.TestSuite.runTest(TestSuite.java:228) at junit.framework.TestSuite.run(TestSuite.java:223) at org.junit.internal.runners.OldTestClassRunner.run( OldTestClassRunner.java:35) at org.apache.maven.surefire.junit4.JUnit4TestSet.execute( JUnit4TestSet.java:62) at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.executeTestSet( AbstractDirectoryTestSuite.java:138) at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.execute( AbstractDirectoryTestSuite.java:125) at org.apache.maven.surefire.Surefire.run(Surefire.java:132) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke( NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke( DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:585) at org.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess( SurefireBooter.java:290) at org.apache.maven.surefire.booter.SurefireBooter.main( SurefireBooter.java:818) Caused by: org.apache.openjpa.persistence.PersistenceException: no-saved-fields at org.apache.openjpa.kernel.StateManagerImpl.dirtyCheck( StateManagerImpl.java:799) at org.apache.openjpa.kernel.BrokerImpl$ManagedCache.dirtyCheck( BrokerImpl.java:4620) at org.apache.openjpa.kernel.BrokerImpl$ManagedCache.access$000( BrokerImpl.java:4360) at org.apache.openjpa.kernel.BrokerImpl.hasTransactionalObjects( BrokerImpl.java:3739) at org.apache.openjpa.kernel.BrokerImpl.setDirty(BrokerImpl.java:3856) at org.apache.openjpa.kernel.StateManagerImpl.setPCState( StateManagerImpl.java:207) at org.apache.openjpa.kernel.StateManagerImpl.dirty( StateManagerImpl.java:1532) at org.apache.openjpa.kernel.StateManagerImpl.dirty( StateManagerImpl.java:1471) at org.apache.openjpa.kernel.StateManagerImpl.dirtyCheck( StateManagerImpl.java:808) at org.apache.openjpa.kernel.BrokerImpl$ManagedCache.dirtyCheck( BrokerImpl.java:4620) at org.apache.openjpa.kernel.BrokerImpl$ManagedCache.access$000( BrokerImpl.java:4360) at org.apache.openjpa.kernel.BrokerImpl.hasTransactionalObjects( BrokerImpl.java:3739) at org.apache.openjpa.kernel.BrokerImpl.setDirty(BrokerImpl.java:3856) at org.apache.openjpa.kernel.StateManagerImpl.setPCState( StateManagerImpl.java:205) at org.apache.openjpa.kernel.StateManagerImpl.delete( StateManagerImpl.java:1070) at org.apache.openjpa.kernel.BrokerImpl.delete(BrokerImpl.java:2518) at org.apache.openjpa.kernel.SingleFieldManager.delete( SingleFieldManager.java:387) at org.apache.openjpa.kernel.SingleFieldManager.delete( SingleFieldManager.java:373) at org.apache.openjpa.kernel.SingleFieldManager.delete( SingleFieldManager.java:330) at org.apache.openjpa.kernel.SingleFieldManager.delete( SingleFieldManager.java:284) at org.apache.openjpa.kernel.StateManagerImpl.cascadeDelete( StateManagerImpl.java:2817) at org.apache.openjpa.kernel.BrokerImpl.delete(BrokerImpl.java:2517) at org.apache.openjpa.kernel.BrokerImpl.delete(BrokerImpl.java:2482) at org.apache.openjpa.kernel.QueryImpl.deleteInMemory(QueryImpl.java :1020) at org.apache.openjpa.kernel.ExpressionStoreQuery$DataStoreExecutor.executeDelete (ExpressionStoreQuery.java:684) at org.apache.openjpa.kernel.QueryImpl.delete(QueryImpl.java:1008) at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:801) at org.apache.openjpa.kernel.QueryImpl.deleteAll(QueryImpl.java:866) at org.apache.openjpa.kernel.QueryImpl.deleteAll(QueryImpl.java:862) at org.apache.openjpa.kernel.DelegatingQuery.deleteAll( DelegatingQuery.java:541) at org.apache.openjpa.persistence.QueryImpl.executeUpdate(QueryImpl.java :314) at org.eremite.corm.party.BeanManagerImpl.clear(BeanManagerImpl.java:66) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke( NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke( DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:585) at org.apache.openejb.core.interceptor.ReflectionInvocationContext$Invocation.invoke (ReflectionInvocationContext.java:146) at org.apache.openejb.core.interceptor.ReflectionInvocationContext.proceed( ReflectionInvocationContext.java:129) at org.apache.openejb.core.interceptor.InterceptorStack.invoke( InterceptorStack.java:67) at org.apache.openejb.core.stateless.StatelessContainer._invoke( StatelessContainer.java:210) at org.apache.openejb.core.stateless.StatelessContainer._invoke( StatelessContainer.java:188) at org.apache.openejb.core.stateless.StatelessContainer.invoke( StatelessContainer.java:165) at org.apache.openejb.core.ivm.EjbObjectProxyHandler.businessMethod( EjbObjectProxyHandler.java:217) at org.apache.openejb.core.ivm.EjbObjectProxyHandler._invoke( EjbObjectProxyHandler.java:77) at org.apache.openejb.core.ivm.BaseEjbProxyHandler.invoke( BaseEjbProxyHandler.java:321) ... 26 more ------=_Part_15271_5653502.1199659364233--