[ 
http://issues.apache.org/jira/browse/OPENJPA-39?page=comments#action_12432220 ] 
            
Abe White commented on OPENJPA-39:
----------------------------------

OpenJPA has to know where the DB foreign keys are.  You have a few options:

- Using the org.apache.openjpa.persistence.ForeignKey annotation, and related 
annnotations (ElementForeignKey, etc) to tell OpenJPA exactly which relations 
and joins have foreign keys on them.
- Setting the "openjpa.jdbc.SchemaFactory" property to 
"native(ForeignKeys=true)" will tell OpenJPA to read the existing schema from 
the DB, including foreign key locations, using JDBC schema reflection.  Under 
this setting OpenJPA will also validate that the schema and mappings match.
-  Setting the "openjpa.jdbc.MappingDefaults" property to 
"jpa(ForeignKeyDeleteAction=restrict, JoinForeignKeyDeleteAction=restrict)" 
will tell OpenJPA to just assume that all relations and joins are backed by 
database foreign keys.

The first and third options also affect schema creation, in that OpenJPA's 
schema creation tools will add foreign keys to to the annotated relations and 
joins / to all relations and joins under those settings.

I'll leave this JIRA open for now in case anyone would like to comment on 
whether we should change the defaults.  Right now the defaults are to never 
assume any relation or join is backed by a database foreign key, and to never 
create database foreign keys during schema creation.

> 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.ALL raises 
> 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