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>