This works great.  Thank you.

On 9/12/06, Abe White (JIRA) <[EMAIL PROTECTED]> wrote:

    [
http://issues.apache.org/jira/browse/OPENJPA-39?page=comments#action_12434283]

Abe White commented on OPENJPA-39:
----------------------------------

I implemented Craig's suggestion of always considering the child object as
deleted first when cascading a delete from parent to child.  So this test
case will now work even with non-nullable foreign key columns.

> Cascade delete does not work with foreign key constraints
> ---------------------------------------------------------
>
>                 Key: OPENJPA-39
>                 URL: http://issues.apache.org/jira/browse/OPENJPA-39
>             Project: OpenJPA
>          Issue Type: Bug
>          Components: jpa
>         Environment: Microsoft SQL Server 2000
> Windows XP
> Java SE 1.5
> OpenJPA - source downloaded Aug 28, 2006)
> Show ยป
> Microsoft SQL Server 2000 Windows XP Java SE 1.5 OpenJPA - source
downloaded today (Aug 14, 2006)
>            Reporter: Megan
>            Priority: Minor
>         Attachments: testcase.zip
>
>
> Removing a parent object in OneToMany with cascade=CascadeType.ALLraises 
foreign key constraints exception
> JpaParent.java
>   @OneToMany(mappedBy="parent", cascade=CascadeType.ALL)
>   private Set<JpaChild> children = new HashSet<JpaChild>();
> JpaChild.java
>   @ManyToOne(optional=false)
>   @JoinColumn(name="ParentId", nullable=false)
>   private JpaParent parent = null;
> // This raises the following exception.  If foreign key is removed, it
works OK (Maybe I have to let OpenJPA know about foreign key constraints)
> JpaParent parent = em.find(JpaParent.class, 1);
> em.remove(parent);
> <2|true|0.9.0-incubating-SNAPSHOT>
org.apache.openjpa.persistence.RollbackException: The transaction has been
rolled back.  See the nested exceptions for details on the errors that
occurred.
>       at org.apache.openjpa.persistence.EntityManagerImpl.commit(
EntityManagerImpl.java:371)
>       at openjpa.test.BaseTestCase.destroyTestCase(BaseTestCase.java:82)
>       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.junit.internal.runners.BeforeAndAfterRunner.invokeMethod(
BeforeAndAfterRunner.java:74)
>       at org.junit.internal.runners.BeforeAndAfterRunner.runAfters(
BeforeAndAfterRunner.java:65)
>       at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(
BeforeAndAfterRunner.java:37)
>       at org.junit.internal.runners.TestMethodRunner.runMethod(
TestMethodRunner.java:75)
>       at org.junit.internal.runners.TestMethodRunner.run(
TestMethodRunner.java:45)
>       at
org.junit.internal.runners.TestClassMethodsRunner.invokeTestMethod(
TestClassMethodsRunner.java:71)
>       at org.junit.internal.runners.TestClassMethodsRunner.run(
TestClassMethodsRunner.java:35)
>       at org.junit.internal.runners.TestClassRunner$1.runUnprotected(
TestClassRunner.java:42)
>       at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(
BeforeAndAfterRunner.java:34)
>       at org.junit.internal.runners.TestClassRunner.run(
TestClassRunner.java:52)
>       at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(
JUnit4TestReference.java:38)
>       at org.eclipse.jdt.internal.junit.runner.TestExecution.run(
TestExecution.java:38)
>       at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests
(RemoteTestRunner.java:460)
>       at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests
(RemoteTestRunner.java:673)
>       at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(
RemoteTestRunner.java:386)
>       at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(
RemoteTestRunner.java:196)
> Caused by: <0|true|0.9.0-incubating-SNAPSHOT>
org.apache.openjpa.persistence.PersistenceException: The transaction has
been rolled back.  See the nested exceptions for details on the errors that
occurred.
>       at org.apache.openjpa.kernel.BrokerImpl.newFlushException(
BrokerImpl.java:2028)
>       at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java
:1876)
>       at org.apache.openjpa.kernel.BrokerImpl.flushSafe(BrokerImpl.java
:1772)
>       at org.apache.openjpa.kernel.BrokerImpl.beforeCompletion(
BrokerImpl.java:1706)
>       at org.apache.openjpa.kernel.LocalManagedRuntime.commit(
LocalManagedRuntime.java:76)
>       at org.apache.openjpa.kernel.BrokerImpl.commit(BrokerImpl.java
:1271)
>       at org.apache.openjpa.kernel.DelegatingBroker.commit(
DelegatingBroker.java:831)
>       at org.apache.openjpa.persistence.EntityManagerImpl.commit(
EntityManagerImpl.java:360)
>       ... 21 more
> Caused by: <0|false|0.9.0-incubating-SNAPSHOT>
org.apache.openjpa.persistence.PersistenceException: [BEA][SQLServer JDBC
Driver][SQLServer]DELETE statement conflicted with COLUMN REFERENCE
constraint 'JpaChild_Parent_FK'. The conflict occurred in database 'pocdb',
table 'JpaChild', column 'ParentId'. {prepstmnt 32048085 DELETE FROM
JpaParent WHERE Id = ? AND OptLock = ? [params=(int) 1, (int) 1]} [code=547,
state=23000]
> FailedObject: openjpa.model.JpaParent-1
>       at org.apache.openjpa.jdbc.sql.DBDictionary.newStoreException(
DBDictionary.java:3701)
>       at org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(
SQLExceptions.java:94)
>       at org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(
SQLExceptions.java:64)
>       at
org.apache.openjpa.jdbc.kernel.PreparedStatementManagerImpl.flushInternal(
PreparedStatementManagerImpl.java:103)
>       at
org.apache.openjpa.jdbc.kernel.PreparedStatementManagerImpl.flush(
PreparedStatementManagerImpl.java:68)
>       at
org.apache.openjpa.jdbc.kernel.OperationOrderUpdateManager.flushPrimaryRow
(OperationOrderUpdateManager.java:158)
>       at
org.apache.openjpa.jdbc.kernel.OperationOrderUpdateManager.flush(
OperationOrderUpdateManager.java:86)
>       at org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.flush(
AbstractUpdateManager.java:88)
>       at org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.flush(
AbstractUpdateManager.java:68)
>       at org.apache.openjpa.jdbc.kernel.JDBCStoreManager.flush(
JDBCStoreManager.java:512)
>       at org.apache.openjpa.kernel.DelegatingStoreManager.flush(
DelegatingStoreManager.java:127)
>       ... 28 more
> Caused by: org.apache.openjpa.lib.jdbc.ReportingSQLException:
[BEA][SQLServer JDBC Driver][SQLServer]DELETE statement conflicted with
COLUMN REFERENCE constraint 'JpaChild_Parent_FK'. The conflict occurred in
database 'pocdb', table 'JpaChild', column 'ParentId'. {prepstmnt 32048085
DELETE FROM JpaParent WHERE Id = ? AND OptLock = ? [params=(int) 1, (int)
1]} [code=547, state=23000]
>       at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.wrap(
LoggingConnectionDecorator.java:186)
>       at
org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.access$700(
LoggingConnectionDecorator.java:53)
>       at
org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator$LoggingConnection$LoggingPreparedStatement.executeUpdate
(LoggingConnectionDecorator.java:839)
>       at
org.apache.openjpa.lib.jdbc.DelegatingPreparedStatement.executeUpdate(
DelegatingPreparedStatement.java:266)
>       at
org.apache.openjpa.jdbc.kernel.JDBCStoreManager$CancelPreparedStatement.executeUpdate
(JDBCStoreManager.java:1359)
>       at
org.apache.openjpa.jdbc.kernel.PreparedStatementManagerImpl.flushInternal(
PreparedStatementManagerImpl.java:92)
>       ... 35 more

--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira



Reply via email to