I have tried another approach using SecondaryTable, exception still happens.
However, if I use the auto-generated "UID" column as Primary Key and "ID" as
unique Key, it works. It seems to me that Unique Key and Primary Key are
treated differently by OpenJPA? Anyone can help? Thanks.
new A
@Entity
@Table(name = "A")
@SecondaryTable(name = "B", pkJoinColumns = { @PrimaryKeyJoinColumn(name =
"PUID", referencedColumnName = "UID") })
public class A implements Serializable {
/**
*
*/
private static final long serialVersionUID = -422971967901446019L;
@Id
@Column(name = "ID")
private String id;
@Basic(optional = true)
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "UID")
private Integer uid;
@Basic(optional = true)
@Column(name = "DATA")
private String data;
@Basic(optional = true)
@Column(table = "B", name = "AUXDATA")
private String auxdata;
public A() {
}
public A(String id) {
this.id = id;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public Integer getUid() {
return uid;
}
public void setUid(Integer uid) {
this.uid = uid;
}
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
public String getAuxdata() {
return auxdata;
}
public void setAuxdata(String auxdata) {
this.auxdata = auxdata;
}
}
new Test
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
EntityManagerFactory emf = Persistence
.createEntityManagerFactory("TestPersistence");
EntityManager em = emf.createEntityManager();
EntityTransaction tr = em.getTransaction();
tr.begin();
A a = new A();
a.setData("abc");
a.setId("n");
a.setAuxdata("aaaaa");
em.persist(a);
tr.commit();
}
}
the exception is
1828 TestPersistence TRACE [main] openjpa.Runtime - An exception occurred
while ending the transaction. This exception will be re-thrown.
<openjpa-2.0.0-M3-r422266:822833 fatal store error>
org.apache.openjpa.util.StoreException: 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:2249)
at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:2096)
at org.apache.openjpa.kernel.BrokerImpl.flushSafe(BrokerImpl.java:1994)
at
org.apache.openjpa.kernel.BrokerImpl.beforeCompletion(BrokerImpl.java:1912)
at
org.apache.openjpa.kernel.LocalManagedRuntime.commit(LocalManagedRuntime.java:81)
at org.apache.openjpa.kernel.BrokerImpl.commit(BrokerImpl.java:1436)
at
org.apache.openjpa.kernel.DelegatingBroker.commit(DelegatingBroker.java:895)
at
org.apache.openjpa.persistence.EntityManagerImpl.commit(EntityManagerImpl.java:557)
at Test.main(Test.java:32)
Caused by: <openjpa-2.0.0-M3-r422266:822833 fatal store error>
org.apache.openjpa.util.ReferentialIntegrityException: DB2 SQL error:
SQLCODE: -407, SQLSTATE: 23502, SQLERRMC: TBSPACEID=2, TABLEID=264, COLNO=0
FailedObject: prepstmnt 1645109774 INSERT INTO test.B (PUID, AUXDATA) VALUES
(?, ?)
[org.apache.openjpa.jdbc.kernel.JDBCStoreManager$CancelPreparedStatement_]
at
org.apache.openjpa.jdbc.sql.DBDictionary.narrow(DBDictionary.java:4584)
at
org.apache.openjpa.jdbc.sql.DBDictionary.newStoreException(DBDictionary.java:4543)
at
org.apache.openjpa.jdbc.sql.DB2Dictionary.newStoreException(DB2Dictionary.java:541)
at
org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:102)
at
org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:72)
at
org.apache.openjpa.jdbc.kernel.BatchingPreparedStatementManagerImpl.flushBatch(BatchingPreparedStatementManagerImpl.java:193)
at
org.apache.openjpa.jdbc.kernel.BatchingConstraintUpdateManager.flush(BatchingConstraintUpdateManager.java:63)
at
org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.flush(AbstractUpdateManager.java:103)
at
org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.flush(AbstractUpdateManager.java:76)
at
org.apache.openjpa.jdbc.kernel.JDBCStoreManager.flush(JDBCStoreManager.java:677)
at
org.apache.openjpa.kernel.DelegatingStoreManager.flush(DelegatingStoreManager.java:130)
... 8 more
Caused by: com.ibm.db2.jcc.a.SqlException: DB2 SQL error: SQLCODE: -407,
SQLSTATE: 23502, SQLERRMC: TBSPACEID=2, TABLEID=264, COLNO=0
at com.ibm.db2.jcc.a.rf.d(rf.java:1396)
at com.ibm.db2.jcc.b.jb.l(jb.java:356)
at com.ibm.db2.jcc.b.jb.a(jb.java:64)
at com.ibm.db2.jcc.b.w.a(w.java:48)
at com.ibm.db2.jcc.b.dc.c(dc.java:312)
at com.ibm.db2.jcc.a.sf.cb(sf.java:1695)
at com.ibm.db2.jcc.a.sf.d(sf.java:2287)
at com.ibm.db2.jcc.a.sf.d(sf.java:2415)
at com.ibm.db2.jcc.a.sf.Y(sf.java:540)
at com.ibm.db2.jcc.a.sf.executeUpdate(sf.java:523)
at
org.apache.openjpa.lib.jdbc.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:285)
at
org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator$LoggingConnection$LoggingPreparedStatement.executeUpdate(LoggingConnectionDecorator.java:1067)
at
org.apache.openjpa.lib.jdbc.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:285)
at
org.apache.openjpa.jdbc.kernel.JDBCStoreManager$CancelPreparedStatement.executeUpdate(JDBCStoreManager.java:1612)
at
org.apache.openjpa.jdbc.kernel.PreparedStatementManagerImpl.executeUpdate(PreparedStatementManagerImpl.java:246)
at
org.apache.openjpa.jdbc.kernel.BatchingPreparedStatementManagerImpl.flushSingleRow(BatchingPreparedStatementManagerImpl.java:215)
at
org.apache.openjpa.jdbc.kernel.BatchingPreparedStatementManagerImpl.flushBatch(BatchingPreparedStatementManagerImpl.java:154)
... 13 more
--
View this message in context:
http://openjpa.208410.n2.nabble.com/CacadeType-Persist-problem-tp6367387p6371784.html
Sent from the OpenJPA Users mailing list archive at Nabble.com.