can you try this code? Your issue may be related to SQL re-ordering.
Company c = new Company();
c.setId( (long)i );
c.setName( "Company "+i );
c.setCustomers( new HashSet<Customer>() );
// explicit flush for company before adding relationships
em.flush();
for ( int j = 0; j < 5; j++ ) {
Customer cus = new Customer();
cus.setId( 100L*i+j );
cus.setName( "Customer" + 100L*i+j );
cus.setCompany(c);
c.getCustomers().add(cus);
}
em.persist(c);
em.flush();
Thanks
- rajeev.
On Tue, Apr 22, 2008 at 2:07 PM, Sebastian Gauder
<[EMAIL PROTECTED]> wrote:
> Hey,
>
> I'm trying to persist the following code:
>
> Company c = new Company();
> c.setId( (long)i );
> c.setName( "Company "+i );
> c.setCustomers( new HashSet<Customer>() );
> for ( int j = 0; j < 5; j++ ) {
> Customer cus = new Customer();
> cus.setId( 100L*i+j );
> cus.setName( "Customer" + 100L*i+j );
> cus.setCompany(c);
> c.getCustomers().add(cus);
> }
> em.persist(c);
> em.flush();
>
>
> with these entities:
>
> @Entity
> @Table(name = "JBT_Company")
> public class Company {
>
> protected Long id;
>
> public void setId(Long inId) {
> this.id = inId;
> }
>
> @Id
> public Long getId() {
> return id;
> }
>
> protected String name;
>
> public String getName() {
> return name;
> }
>
> public void setName(String name) {
> this.name = name;
> }
>
> protected Set<Customer> customerSet;
>
> @OneToMany(mappedBy = "company",cascade = CascadeType.ALL)
> public Set<Customer> getCustomers() {
> return customerSet;
> }
>
> public void setCustomers(Set<Customer> inCustomerSet) {
> this.customerSet = inCustomerSet;
> }
> }
>
>
> @Entity
> @Table(name = "JBT_Customer")
> public class Customer {
>
> protected Long id;
>
> public void setId(Long inId) {
> this.id = inId;
> }
>
> @Id
> public Long getId() {
> return id;
> }
>
> protected String name;
>
> public String getName() {
> return name;
> }
>
> public void setName(String name) {
> this.name = name;
> }
>
> protected Company company;
>
> @ManyToOne
> @JoinColumn(name = "company_id")
> public Company getCompany() {
> return company;
> }
>
> public void setCompany(Company inCompany) {
> this.company = inCompany;
> }
> }
>
>
> It works for MySQL, but not for PostgreSQL 8.2. The follwing Exception is
> thrown:
>
> 40235 postgres INFO [RMI TCP Connection(6)-10.0.10.88] openjpa.Runtime
> - Starting OpenJPA 1.0.2
> 40766 postgres TRACE [RMI TCP Connection(6)-10.0.10.88] openjpa.jdbc.SQL
> - <t 31001198, conn 3920972> executing prepstmnt 5188636 SELECT NULL AS
> SEQUENCE_SCHEMA, relname AS SEQUENCE_NAME FROM pg_class WHERE relkind='S'
> 40782 postgres TRACE [RMI TCP Connection(6)-10.0.10.88] openjpa.jdbc.SQL
> - <t 31001198, conn 3920972> [16 ms] spent
> 41313 postgres TRACE [RMI TCP Connection(6)-10.0.10.88] openjpa.jdbc.SQL
> - <t 31001198, conn 24050576> executing prepstmnt 17582220 DELETE FROM
> JBT_Customer
> 41328 postgres TRACE [RMI TCP Connection(6)-10.0.10.88] openjpa.jdbc.SQL
> - <t 31001198, conn 24050576> [15 ms] spent
> 41328 postgres TRACE [RMI TCP Connection(6)-10.0.10.88] openjpa.jdbc.SQL
> - <t 31001198, conn 24050576> executing prepstmnt 3724097 DELETE FROM
> JBT_Company
> 41328 postgres TRACE [RMI TCP Connection(6)-10.0.10.88] openjpa.jdbc.SQL
> - <t 31001198, conn 24050576> [0 ms] spent
> 41422 postgres TRACE [RMI TCP Connection(6)-10.0.10.88] openjpa.jdbc.SQL
> - <t 31001198, conn 11834918> executing prepstmnt 27655609 INSERT INTO
> JBT_Customer (id, name, company_id) VALUES (?, ?, ?) [params=(long) 3,
> (String) Customer03, (long) 0]
> 41438 postgres TRACE [RMI TCP Connection(6)-10.0.10.88] openjpa.jdbc.SQL
> - <t 31001198, conn 11834918> [16 ms] spent
> 41438 postgres TRACE [RMI TCP Connection(6)-10.0.10.88] openjpa.jdbc.SQL
> - <t 31001198, conn 11834918> executing prepstmnt 29204960 INSERT INTO
> JBT_Customer (id, name, company_id) VALUES (?, ?, ?) [params=(long) 0,
> (String) Customer00, (long) 0]
> 41453 postgres TRACE [RMI TCP Connection(6)-10.0.10.88] openjpa.jdbc.SQL
> - <t 31001198, conn 11834918> [15 ms] spent
> 41453 postgres TRACE [RMI TCP Connection(6)-10.0.10.88] openjpa.jdbc.SQL
> - <t 31001198, conn 11834918> executing prepstmnt 13540318 INSERT INTO
> JBT_Customer (id, name, company_id) VALUES (?, ?, ?) [params=(long) 1,
> (String) Customer01, (long) 0]
> 41453 postgres TRACE [RMI TCP Connection(6)-10.0.10.88] openjpa.jdbc.SQL
> - <t 31001198, conn 11834918> [0 ms] spent
> 41453 postgres TRACE [RMI TCP Connection(6)-10.0.10.88] openjpa.jdbc.SQL
> - <t 31001198, conn 11834918> executing prepstmnt 5978200 INSERT INTO
> JBT_Company (id, name) VALUES (?, ?) [params=(long) 0, (String) Company 0]
> 41469 postgres TRACE [RMI TCP Connection(6)-10.0.10.88] openjpa.jdbc.SQL
> - <t 31001198, conn 11834918> [16 ms] spent
> 41469 postgres TRACE [RMI TCP Connection(6)-10.0.10.88] openjpa.jdbc.SQL
> - <t 31001198, conn 11834918> executing prepstmnt 13640927 INSERT INTO
> JBT_Customer (id, name, company_id) VALUES (?, ?, ?) [params=(long) 4,
> (String) Customer04, (long) 0]
> 41469 postgres TRACE [RMI TCP Connection(6)-10.0.10.88] openjpa.jdbc.SQL
> - <t 31001198, conn 11834918> [0 ms] spent
> 41469 postgres TRACE [RMI TCP Connection(6)-10.0.10.88] openjpa.jdbc.SQL
> - <t 31001198, conn 11834918> executing prepstmnt 19188912 INSERT INTO
> JBT_Customer (id, name, company_id) VALUES (?, ?, ?) [params=(long) 2,
> (String) Customer02, (long) 0]
> 41485 postgres TRACE [RMI TCP Connection(6)-10.0.10.88] openjpa.jdbc.SQL
> - <t 31001198, conn 11834918> [16 ms] spent
> 22.04.2008 10:12:26
> org.springframework.remoting.support.RemoteInvocationTraceInterceptor invoke
> WARNUNG: Processing of RmiServiceExporter remote call resulted in fatal
> exception: com.denkwerk.jbt.server.spring.SpringBenchmarkBean.buildUp
> <openjpa-1.0.2-r420667:627158 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.
> at
> org.apache.openjpa.kernel.BrokerImpl.newFlushException(BrokerImpl.java:2108)
> at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:1955)
> at org.apache.openjpa.kernel.BrokerImpl.flushSafe(BrokerImpl.java:1853)
> at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:1624)
> at
> org.apache.openjpa.kernel.DelegatingBroker.flush(DelegatingBroker.java:973)
> at
> org.apache.openjpa.persistence.EntityManagerImpl.flush(EntityManagerImpl.java:488)
> at sun.reflect.GeneratedMethodAccessor10.invoke(Unknown Source)
> at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
> at java.lang.reflect.Method.invoke(Method.java:597)
> at
> org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:193)
> at $Proxy7.flush(Unknown Source)
> at com.denkwerk.jbt.elements.benchmarks.B03.B03.buildUp(B03.java:48)
> at com.denkwerk.jbt.server.AbstractRunner.buildUp(AbstractRunner.java:21)
> at
> com.denkwerk.jbt.server.spring.PostgresQLBenchmarkBeanImpl.buildUp(PostgresQLBenchmarkBeanImpl.java:21)
> at sun.reflect.GeneratedMethodAccessor19.invoke(Unknown Source)
> at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
> at java.lang.reflect.Method.invoke(Method.java:597)
> at
> org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:310)
> at
> org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182)
> at
> org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149)
> at
> org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106)
> at
> org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
> at
> org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
> at $Proxy8.buildUp(Unknown Source)
> at sun.reflect.GeneratedMethodAccessor19.invoke(Unknown Source)
> at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
> at java.lang.reflect.Method.invoke(Method.java:597)
> at
> org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:310)
> at
> org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182)
> at
> org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149)
> at
> org.springframework.remoting.support.RemoteInvocationTraceInterceptor.invoke(RemoteInvocationTraceInterceptor.java:70)
> at
> org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
> at
> org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
> at $Proxy8.buildUp(Unknown Source)
> at sun.reflect.GeneratedMethodAccessor36.invoke(Unknown Source)
> at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
> at java.lang.reflect.Method.invoke(Method.java:597)
> at
> org.springframework.remoting.support.RemoteInvocation.invoke(RemoteInvocation.java:205)
> at
> org.springframework.remoting.support.DefaultRemoteInvocationExecutor.invoke(DefaultRemoteInvocationExecutor.java:38)
> at
> org.springframework.remoting.support.RemoteInvocationBasedExporter.invoke(RemoteInvocationBasedExporter.java:78)
> at
> org.springframework.remoting.rmi.RmiBasedExporter.invoke(RmiBasedExporter.java:72)
> at
> org.springframework.remoting.rmi.RmiInvocationWrapper.invoke(RmiInvocationWrapper.java:72)
> at sun.reflect.GeneratedMethodAccessor15.invoke(Unknown Source)
> at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
> at java.lang.reflect.Method.invoke(Method.java:597)
> at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:305)
> at sun.rmi.transport.Transport$1.run(Transport.java:159)
> at java.security.AccessController.doPrivileged(Native Method)
> at sun.rmi.transport.Transport.serviceCall(Transport.java:155)
> at
> sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535)
> at
> sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:790)
> at
> sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:649)
> at
> java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885)
> at
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
> at java.lang.Thread.run(Thread.java:619)
> Caused by: <openjpa-1.0.2-r420667:627158 nonfatal general error>
> org.apache.openjpa.persistence.PersistenceException: ERROR: insert or update
> on table "jbt_customer" violates foreign key constraint "fkf1ca16c177e66402"
> Detail: Key (company_id)=(0) is not present in table "jbt_company".
> {prepstmnt 27655609 INSERT INTO JBT_Customer (id, name, company_id) VALUES
> (?, ?, ?) [params=(long) 3, (String) Customer03, (long) 0]} [code=0,
> state=23503]
> FailedObject: [EMAIL PROTECTED]
> at
> org.apache.openjpa.jdbc.sql.DBDictionary.newStoreException(DBDictionary.java:3946)
> at
> org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:97)
> at
> org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:67)
> at
> org.apache.openjpa.jdbc.kernel.PreparedStatementManagerImpl.flushInternal(PreparedStatementManagerImpl.java:108)
> at
> org.apache.openjpa.jdbc.kernel.PreparedStatementManagerImpl.flush(PreparedStatementManagerImpl.java:73)
> at
> org.apache.openjpa.jdbc.kernel.ConstraintUpdateManager.flush(ConstraintUpdateManager.java:543)
> at
> org.apache.openjpa.jdbc.kernel.ConstraintUpdateManager.flush(ConstraintUpdateManager.java:105)
> at
> org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.flush(AbstractUpdateManager.java:89)
> at
> org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.flush(AbstractUpdateManager.java:72)
> at
> org.apache.openjpa.jdbc.kernel.JDBCStoreManager.flush(JDBCStoreManager.java:514)
> at
> org.apache.openjpa.kernel.DelegatingStoreManager.flush(DelegatingStoreManager.java:130)
> ... 54 more
> Caused by: org.apache.openjpa.lib.jdbc.ReportingSQLException: ERROR: insert
> or update on table "jbt_customer" violates foreign key constraint
> "fkf1ca16c177e66402"
> Detail: Key (company_id)=(0) is not present in table "jbt_company".
> {prepstmnt 27655609 INSERT INTO JBT_Customer (id, name, company_id) VALUES
> (?, ?, ?) [params=(long) 3, (String) Customer03, (long) 0]} [code=0,
> state=23503]
> at
> org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.wrap(LoggingConnectionDecorator.java:192)
> at
> org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.access$800(LoggingConnectionDecorator.java:57)
> at
> org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator$LoggingConnection$LoggingPreparedStatement.executeUpdate(LoggingConnectionDecorator.java:858)
> at
> org.apache.openjpa.lib.jdbc.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:269)
> at
> org.apache.openjpa.lib.jdbc.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:269)
> at
> org.apache.openjpa.jdbc.kernel.JDBCStoreManager$CancelPreparedStatement.executeUpdate(JDBCStoreManager.java:1363)
> at
> org.apache.openjpa.jdbc.kernel.PreparedStatementManagerImpl.flushInternal(PreparedStatementManagerImpl.java:97)
> ... 61 more
> NestedThrowables:
> ...
>
> Seems, that OpenJPA has Problems with the order of INSERT Statements ?!?
>
> Sebastian
>