openjpa-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Philippe Alexis" <philippe.ale...@gmail.com>
Subject Re: [jira] Commented: (OPENJPA-231) Incorrect handling of cascading bidirectional collections during merge/attach
Date Sun, 13 May 2007 19:29:18 GMT
Hi Gokhan,

I'd been busy with work but kept this particular issue at the back of my
mind for coming back to.
How far did you get investigating it?

Firstly, I had no problem getting updateAttached (EntityManager em) to run
fine on both SQL Server and Postgresql,
got the count of 4.

For updateDetached (EntityManager em), I was able to get it to 'work' by
allowing cascading from C to B on the @ManyToOne

>From the lack of response to this issue, I'm thinking this might be a design
decision the bigger picture of which is eluding me.
Anyone would care to shed some light on this, why @ManyToOne(cascade=
CascadeType.ALL) solves the problem reported?

On MySQL, updateDetached works fine with the modification:
@ManyToOne(cascade=CascadeType.ALL)

But for updateAttached, the issue of apparently attempting to save instances
of C before those of B persists with and without
the above change:
===================================================
     [java] Caused by: <0.9.7-incubating fatal general error>
org.apache.openjpa.persistence.PersistenceException: The transaction has
been rolled back.  See the nested exceptions for details on the errors that
occurred.
     [java] at org.apache.openjpa.kernel.BrokerImpl.newFlushException(
BrokerImpl.java:2118)
     [java] at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java
:1965)
     [java] at org.apache.openjpa.kernel.BrokerImpl.flushSafe(
BrokerImpl.java:1863)
     [java] at org.apache.openjpa.kernel.BrokerImpl.beforeCompletion(
BrokerImpl.java:1781)
     [java] at org.apache.openjpa.kernel.LocalManagedRuntime.commit(
LocalManagedRuntime.java:80)
     [java] at org.apache.openjpa.kernel.BrokerImpl.commit(BrokerImpl.java
:1311)
     [java] at org.apache.openjpa.kernel.DelegatingBroker.commit(
DelegatingBroker.java:866)
     [java] at org.apache.openjpa.persistence.EntityManagerImpl.commit(
EntityManagerImpl.java:409)
     [java] ... 23 more
     [java] Caused by: <0.9.7-incubating nonfatal general error>
org.apache.openjpa.persistence.PersistenceException: Cannot add or update a
child row: a foreign key constraint fails (`test/test_c`, CONSTRAINT
`FK_TEST_C_REFERENCE_TEST_B` FOREIGN KEY (`B_ID`) REFERENCES `test_b`
(`B_ID`)) {prepstmnt 7832149 INSERT INTO TEST_C (c_id, B_ID) VALUES (?, ?)
[params=(int) 4, (int) 4]} [code=1452, state=23000]
     [java] FailedObject: test.C@1236cd5
     [java] at org.apache.openjpa.jdbc.sql.DBDictionary.newStoreException(
DBDictionary.java:3782)
     [java] at org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(
SQLExceptions.java:97)
     [java] at org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(
SQLExceptions.java:67)
     [java] at
org.apache.openjpa.jdbc.kernel.PreparedStatementManagerImpl.flushInternal(
PreparedStatementManagerImpl.java:106)
     [java] at
org.apache.openjpa.jdbc.kernel.PreparedStatementManagerImpl.flush(
PreparedStatementManagerImpl.java:71)
     [java] at
org.apache.openjpa.jdbc.kernel.OperationOrderUpdateManager.flushPrimaryRow(
OperationOrderUpdateManager.java:203)
     [java] at
org.apache.openjpa.jdbc.kernel.OperationOrderUpdateManager.flush(
OperationOrderUpdateManager.java:89)
     [java] at org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.flush(
AbstractUpdateManager.java:89)
     [java] at org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.flush(
AbstractUpdateManager.java:72)
     [java] at org.apache.openjpa.jdbc.kernel.JDBCStoreManager.flush(
JDBCStoreManager.java:514)
     [java] at org.apache.openjpa.kernel.DelegatingStoreManager.flush(
DelegatingStoreManager.java:130)
     [java] ... 30 more
     [java] Caused by: org.apache.openjpa.lib.jdbc.ReportingSQLException:
Cannot add or update a child row: a foreign key constraint fails
(`test/test_c`, CONSTRAINT `FK_TEST_C_REFERENCE_TEST_B` FOREIGN KEY (`B_ID`)
REFERENCES `test_b` (`B_ID`)) {prepstmnt 7832149 INSERT INTO TEST_C (c_id,
B_ID) VALUES (?, ?) [params=(int) 4, (int) 4]} [code=1452, state=23000]
     [java] at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.wrap(
LoggingConnectionDecorator.java:191)
     [java] at
org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.access$800(
LoggingConnectionDecorator.java:56)
     [java] at
org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator$LoggingConnection$LoggingPreparedStatement.executeUpdate
(LoggingConnectionDecorator.java:857)
     [java] at
org.apache.openjpa.lib.jdbc.DelegatingPreparedStatement.executeUpdate(
DelegatingPreparedStatement.java:269)
     [java] at
org.apache.openjpa.jdbc.kernel.JDBCStoreManager$CancelPreparedStatement.executeUpdate
(JDBCStoreManager.java:1363)
     [java] at
org.apache.openjpa.jdbc.kernel.PreparedStatementManagerImpl.flushInternal(
PreparedStatementManagerImpl.java:95)
     [java] ... 37 more
===================================================

J-Philippe.

On 5/4/07, Gokhan Ergul <gokhan.ergul@telenity.com> wrote:
>
> Philippe,
>
> I must admit I'm quite illiterate when it comes to Eclipse --ditched it
> a long time ago in favor of Idea. You must be right about the build.xml
> being a not-so-straightforward root for Eclipse import, it didn't occur
> to me that it could be used that way. Having said that, here's my
> (purely speculative) comments about the problem you're having:
>
> > [java] javax.persistence.PersistenceException: Invalid or inaccessible
> > provider class: org.apache.openjpa.persistence.PersistenceProviderImpl
> >     [java] at org.apache.tools.ant.taskdefs.ExecuteJava.execute(
> > ExecuteJava.java:180)
> That sure looks like a classpath problem to me, and the fact that it's
> coming from ant..ExecuteJava is somewhat telling, the Eclipse-generated
> build.xml is running a <java ..> task instead of an <openjpac> task,
> possibly with a different classpath.
>
> > Is the use of <taskdef name="openjpac" classname="
> > org.apache.openjpa.ant.PCEnhancerTask"/>
> > the equivalent of what is done for the examples with
> >
> > <!--
> >                Specifying the openjpa jar as the javaagent argument is
> >                necessary in order for automatic class-enhancement to
> > work.
> >            -->
> >            <jvmarg value="-javaagent:${javaagent}"/>    ?
>
> <openjpac> task performs a build-time class enhancement, whereas the
> "-javaagent" method performs a run-time enhancement, you can use either
> as long as the environment is setup properly. Since the above exception
> is coming from a <java> task, I'm assuming you're using run-time
> enhancement method, then it boils down to setting the correct classpath
> entries.
>
> If you can post the relevant parts of your build.xml, it'll be easier to
> spot the problem.
>
> Gokhan.
>

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