I wrote some unit tests integrating JPA, test data and my DAOs and one test has me worried that something is wrong.

The test is quite simple: I delete a parent entity mapped one-to-many with no cascade configured (see end for mapping), and verify that the children present are not deleted and instead trigger a relational integrity exception.

    public void testDeleteOneToManyNoCascadeException()
    {
        Market market = (Market) getFirstObjectInQuery("Test.findAllMarkets");
        marketDao.delete(market.getId());   //entityManager.remove(market);
        boolean error = false;
        try
        {
            super.commitTransaction();
        }
        catch (Exception e)
        {
            e.printStackTrace();
            error = true;
        }
        Assert.assertTrue("should have got an exception", error);
    }

I do not get the expected SQLException, I get an ArgumentException:

<openjpa-1.1.0-SNAPSHOT-r420667:603666 nonfatal user error> org.apache.openjpa.persistence.ArgumentException: Encountered deleted object "org.apache.openjpa.enhance.org$permacode$patternrepo$domain$Market$pcsubclass-org.permacode.patternrepo.domain.Market-1" in persistent field "org.permacode.patternrepo.domain.TestResult.market" of managed object "org.apache.openjpa.enhance.org$permacode$patternrepo$domain$TestResult$pcsubclass-org.permacode.patternrepo.domain.TestResult-1" during flush. FailedObject: [EMAIL PROTECTED] at org.apache.openjpa.kernel.SingleFieldManager.preFlushPC(SingleFieldManager.java:766) at org.apache.openjpa.kernel.SingleFieldManager.preFlush(SingleFieldManager.java:594) at org.apache.openjpa.kernel.SingleFieldManager.preFlush(SingleFieldManager.java:562) at org.apache.openjpa.kernel.SingleFieldManager.preFlush(SingleFieldManager.java:478)
        at 
org.apache.openjpa.kernel.StateManagerImpl.preFlush(StateManagerImpl.java:2801)
        at 
org.apache.openjpa.kernel.PDirtyState.beforeFlush(PDirtyState.java:37)
at org.apache.openjpa.kernel.StateManagerImpl.beforeFlush(StateManagerImpl.java:958)
        at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:1923)
        at org.apache.openjpa.kernel.BrokerImpl.flushSafe(BrokerImpl.java:1883)
        at 
org.apache.openjpa.kernel.BrokerImpl.beforeCompletion(BrokerImpl.java:1801)
at org.apache.openjpa.kernel.LocalManagedRuntime.commit(LocalManagedRuntime.java:81)
        at org.apache.openjpa.kernel.BrokerImpl.commit(BrokerImpl.java:1325)
        at 
org.apache.openjpa.kernel.DelegatingBroker.commit(DelegatingBroker.java:861)
at org.apache.openjpa.persistence.EntityManagerImpl.commit(EntityManagerImpl.java:479)
        ... 22 more


<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm";
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_1_0.xsd";
  version="1.0">
  <table-generator name="marketKeySequence" table="KEY_SEQUENCE"
    pk-column-name="TABLE_SEQ" value-column-name="LAST_KEY"
    pk-column-value="MARKET">
  </table-generator>
  <entity class="org.permacode.patternrepo.domain.Market">
    <table name="MARKET" />
    <named-query name="Market.findById">
      <query>select m from Market m where m.id = ?1</query>
    </named-query>
    <named-query name="Market.findAll">
      <query>select m from Market m</query>
    </named-query>
    <attributes>
      <id name="id">
        <column name="ID" />
        <generated-value strategy="TABLE" generator="marketKeySequence" />
      </id>
      <basic name="symbol">
        <column name="SYMBOL" />
      </basic>
      <basic name="title">
        <column name="TITLE" />
      </basic>
      <one-to-many name="testResults" mapped-by="market">
      </one-to-many>
    </attributes>
  </entity>
</entity-mappings>

<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm";
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_1_0.xsd";
  version="1.0">
  <table-generator name="testResultKeySequence" table="KEY_SEQUENCE"
    pk-column-name="TABLE_SEQ" value-column-name="LAST_KEY"
    pk-column-value="TEST_RESULT">
  </table-generator>
  <entity class="org.permacode.patternrepo.domain.TestResult">
    <table name="TEST_RESULT" />
    <named-query name="TestResult.findById">
      <query>select t from TestResult t where t.id = ?1</query>
    </named-query>
    <attributes>
      <id name="id">
        <column name="ID" />
        <generated-value strategy="TABLE" generator="testResultKeySequence" />
      </id>
      <basic name="title">
        <column name="TITLE" />
      </basic>
      <basic name="stats">
        <column name="STATS" />
      </basic>
      <many-to-one name="code">
        <join-column name="CODE_ID"/>
      </many-to-one>
      <many-to-one name="market">
        <join-column name="MARKET_ID"/>
      </many-to-one>
      <one-to-many name="tradingParams" mapped-by="testResult">
        <cascade>
          <cascade-all />
        </cascade>
      </one-to-many>
    </attributes>
  </entity>
</entity-mappings>

Reply via email to