openjpa-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Alexander Saint Croix" <saintx.opensou...@gmail.com>
Subject Re: Nuking tables on tearDown() for CRUD tests
Date Mon, 07 Jan 2008 00:31:43 GMT
Thank you very much, Pinaki.  I am already using the property field you
described.  Other ideas?
--
Alexander R. Saint Croix




On Jan 6, 2008 6:08 PM, Pinaki Poddar <ppoddar@apache.org> wrote:

>
> Did you try the following configuration:
> <property name="openjpa.jdbc.SynchronizeMappings"
> value="buildSchema(ForeignKeys=true,
> SchemaAction='deleteTableContents')"/>
>
>
>
>
> uote author="Alexander Saint Croix-2">
> 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<Query> queries = new HashSet<Query>();
>        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:
>    <openjpa-1.0.1-r420667:592145 fatal general error>
> 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: <openjpa-1.0.1-r420667:592145 fatal general error>
> 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
>
>
>
> --
> View this message in context:
> http://www.nabble.com/Nuking-tables-on-tearDown%28%29-for-CRUD-tests-tp14655065p14655999.html
> Sent from the OpenJPA Users mailing list archive at Nabble.com.
>
>

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message