Java OpenJPA:级联删除问题

Java OpenJPA:级联删除问题,java,db2,openjpa,Java,Db2,Openjpa,我有以下实体: //Parent @Entity @Table(name = "PARENT") public class Parent implements Serializable { private static final long serialVersionUID = 1L; @Id @Column(name = "PRIMARY_ID", updatable = false) @GeneratedValue(strategy = GenerationType.IDENTITY)

我有以下实体:

//Parent
@Entity
@Table(name = "PARENT")
public class Parent  implements Serializable { 
private static final long serialVersionUID = 1L;

@Id
@Column(name = "PRIMARY_ID", updatable = false)
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer primaryID;

@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER, targetEntity = Child.class)
private List<Child> child;

//Child

@Entity
@Table(name = "CHILD")
public class Child  implements Serializable {

private static final long serialVersionUID = 1L;

@EmbeddedId
private ChildPK id;

@MapsId("primaryID") //Maps to primaryID in ChildPK
@ManyToOne
@JoinColumn(name = "PRIMARY_ID",nullable=false)
private Parent parent;

public Child() {
}
我遇到以下异常。请查找以下堆栈跟踪:

Exception in thread "main" <openjpa-2.2.3-SNAPSHOT-r422266:1715851 fatal store error> org.apache.openjpa.persistence.RollbackException: The transaction has been rolled back.  See the nested exceptions for details on the errors that occurred.
FailedObject: com.entity.test.Parent-15149
    at org.apache.openjpa.persistence.EntityManagerImpl.commit(EntityManagerImpl.java:594)
    at com.test.Test.main(Test.java:76)
Caused by: <openjpa-2.2.3-SNAPSHOT-r422266:1715851 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.
FailedObject: com.entity.test.Parent-15149
    at org.apache.openjpa.kernel.BrokerImpl.newFlushException(BrokerImpl.java:2352)
    at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:2189)
    at org.apache.openjpa.kernel.BrokerImpl.flushSafe(BrokerImpl.java:2087)
    at org.apache.openjpa.kernel.BrokerImpl.beforeCompletion(BrokerImpl.java:2005)
    at org.apache.openjpa.kernel.LocalManagedRuntime.commit(LocalManagedRuntime.java:81)
    at org.apache.openjpa.kernel.BrokerImpl.commit(BrokerImpl.java:1529)
    at org.apache.openjpa.kernel.DelegatingBroker.commit(DelegatingBroker.java:933)
    at org.apache.openjpa.persistence.EntityManagerImpl.commit(EntityManagerImpl.java:570)
    ... 1 more
Caused by: <openjpa-2.2.3-SNAPSHOT-r422266:1715851 fatal general error> org.apache.openjpa.persistence.PersistenceException: THE RELATIONSHIP R_CNRLPH RESTRICTS THE DELETION OF ROW WITH RID X'000001271B' {prepstmnt 636888566 DELETE FROM XXXXX.PARENT WHERE PRIMARY_ID = ? [params=?]} [code=-532, state=23504]SQLCA OUTPUT[Errp=DSNXRSDL, Errd=-190, 13172769, 0, 13228485, -742129664, 0]
THE RELATIONSHIP R_CNRLPH RESTRICTS THE DELETION OF ROW WITH RID X'000001271B'
FailedObject: com.entity.test.Parent-15149
    at org.apache.openjpa.jdbc.sql.DBDictionary.narrow(DBDictionary.java:4991)
    at org.apache.openjpa.jdbc.sql.DBDictionary.newStoreException(DBDictionary.java:4957)
    at org.apache.openjpa.jdbc.sql.DB2Dictionary.newStoreException(DB2Dictionary.java:571)
    at org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:136)
    at org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:78)
    at org.apache.openjpa.jdbc.kernel.BatchingPreparedStatementManagerImpl.flushBatch(BatchingPreparedStatementManagerImpl.java:221)
    at org.apache.openjpa.jdbc.kernel.BatchingConstraintUpdateManager.flush(BatchingConstraintUpdateManager.java:63)
    at org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.flush(AbstractUpdateManager.java:105)
    at org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.flush(AbstractUpdateManager.java:78)
    at org.apache.openjpa.jdbc.kernel.JDBCStoreManager.flush(JDBCStoreManager.java:732)
    at org.apache.openjpa.kernel.DelegatingStoreManager.flush(DelegatingStoreManager.java:131)
    ... 8 more
Caused by: org.apache.openjpa.lib.jdbc.ReportingSQLException: THE RELATIONSHIP R_CNRLPH RESTRICTS THE DELETION OF ROW WITH RID X'000001271B' {prepstmnt 636888566 DELETE FROM XXXXX.PARENT WHERE PRIMARY_ID = ? [params=?]} [code=-532, state=23504]
    at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.wrap(LoggingConnectionDecorator.java:219)
    at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.wrap(LoggingConnectionDecorator.java:195)
    at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.access$1000(LoggingConnectionDecorator.java:59)
    at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator$LoggingConnection$LoggingPreparedStatement.executeUpdate(LoggingConnectionDecorator.java:1134)
    at org.apache.openjpa.lib.jdbc.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:275)
    at org.apache.openjpa.jdbc.kernel.JDBCStoreManager$CancelPreparedStatement.executeUpdate(JDBCStoreManager.java:1792)
    at org.apache.openjpa.jdbc.kernel.PreparedStatementManagerImpl.executeUpdate(PreparedStatementManagerImpl.java:268)
    at org.apache.openjpa.jdbc.kernel.BatchingPreparedStatementManagerImpl.flushSingleRow(BatchingPreparedStatementManagerImpl.java:250)
    at org.apache.openjpa.jdbc.kernel.BatchingPreparedStatementManagerImpl.flushBatch(BatchingPreparedStatementManagerImpl.java:153)
    ... 13 more
线程“main”org.apache.openjpa.persistence.RollbackException中的异常:事务已回滚。有关发生的错误的详细信息,请参见嵌套异常。 失败对象:com.entity.test.Parent-15149 位于org.apache.openjpa.persistence.EntityManagerImpl.commit(EntityManagerImpl.java:594) 位于com.test.test.main(test.java:76) 原因:org.apache.openjpa.persistence.PersistenceException:事务已回滚。有关发生的错误的详细信息,请参见嵌套异常。 失败对象:com.entity.test.Parent-15149 位于org.apache.openjpa.kernel.BrokerImpl.newFlushException(BrokerImpl.java:2352) 位于org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:2189) 位于org.apache.openjpa.kernel.BrokerImpl.flushSafe(BrokerImpl.java:2087) 在org.apache.openjpa.kernel.BrokerImpl.beforepletion上(BrokerImpl.java:2005) 位于org.apache.openjpa.kernel.LocalManagedRuntime.commit(LocalManagedRuntime.java:81) 位于org.apache.openjpa.kernel.BrokerImpl.commit(BrokerImpl.java:1529) 位于org.apache.openjpa.kernel.DelegatingBroker.commit(DelegatingBroker.java:933) 位于org.apache.openjpa.persistence.EntityManagerImpl.commit(EntityManagerImpl.java:570) ... 还有一个 原因:org.apache.openjpa.persistence.PersistenceException:关系R_CNRLPH限制删除具有RID X'000001271B'{prepstnt 636888566 DELETE FROM XXXXX.PARENT其中PRIMARY_ID=?[params=?]}[code=-532,state=23504]SQLCA输出[Errp=DSNXRSDL,Errd=-19013172769,013228485,-742129664,0] 关系R_CNRLPH限制删除具有RID X“00000 1271b”的行 失败对象:com.entity.test.Parent-15149 位于org.apache.openjpa.jdbc.sql.DBDictionary.窄带(DBDictionary.java:4991) 位于org.apache.openjpa.jdbc.sql.DBDictionary.newStoreException(DBDictionary.java:4957) 位于org.apache.openjpa.jdbc.sql.DB2Dictionary.newStoreException(DB2Dictionary.java:571) 位于org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:136) 位于org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:78) 位于org.apache.openjpa.jdbc.kernel.BatchingPreparedStatementManagerImpl.flushBatch(BatchingPreparedStatementManagerImpl.java:221) 位于org.apache.openjpa.jdbc.kernel.BatchingConstraintUpdateManager.flush(BatchingConstraintUpdateManager.java:63) 位于org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.flush(AbstractUpdateManager.java:105) 位于org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.flush(AbstractUpdateManager.java:78) 位于org.apache.openjpa.jdbc.kernel.JDBCStoreManager.flush(JDBCStoreManager.java:732) 位于org.apache.openjpa.kernel.DelegatingStoreManager.flush(DelegatingStoreManager.java:131) ... 8个以上 原因:org.apache.openjpa.lib.jdbc.ReportingSQLException:关系R_CNRLPH限制删除具有RID X'000001271B'{prepstmnt 636888566 DELETE FROM XXXXX.PARENT,其中PRIMARY_ID=?[params=?]}[code=-532,state=23504] 位于org.apache.openjpa.lib.jdbc.loggingConnectionCorator.wrap(loggingConnectionCorator.java:219) 位于org.apache.openjpa.lib.jdbc.loggingConnectionCorator.wrap(loggingConnectionCorator.java:195) 登录org.apache.openjpa.lib.jdbc.loggingConnectionCorator.access$1000(loggingConnectionCorator.java:59) 位于org.apache.openjpa.lib.jdbc.LoggingConnectionCorator$LoggingConnection$LoggingPreparedStatement.executeUpdate(LoggingConnectionCorator.java:1134) 位于org.apache.openjpa.lib.jdbc.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:275) 位于org.apache.openjpa.jdbc.kernel.JDBCStoreManager$CancelPreparedStatement.executeUpdate(JDBCStoreManager.java:1792) 位于org.apache.openjpa.jdbc.kernel.PreparedStatementManagerImpl.executeUpdate(PreparedStatementManagerImpl.java:268) 位于org.apache.openjpa.jdbc.kernel.BatchingPreparedStatementManagerImpl.flushSingleRow(BatchingPreparedStatementManagerImpl.java:250) 位于org.apache.openjpa.jdbc.kernel.BatchingPreparedStatementManagerImpl.flushBatch(BatchingPreparedStatementManagerImpl.java:153) ... 还有13个 sql执行顺序错误。删除父项上的sql在子项之前执行


目前,我通过在父对象之前对子对象调用移除操作来解决这个问题。我可以通过调用父记录上的删除操作来删除子记录。

如果设置
foreignkeydeletection=restrict
,我想这并不奇怪,是吗?您可能想尝试将其设置为
cascade
。@mustaccio我尝试设置foreignkeydeletection=cascade,JoinForeignKeyDeleteAction=cascade但仍然得到相同的问题如果我从子表中删除@MapsId注释并将persistence.xml中的属性保留为,则效果很好。但这样做,我的persistent操作失败,因为openjpa无法在子表中设置父主键值,我想如果设置
ForeignKeyDeleteAction=restrict
,是吗?您可能想尝试将其设置为
cascade
。@mustaccio我尝试设置foreignkeydeletection=cascade,JoinForeignKeyDeleteAction=cascade,但仍然得到相同的问题如果我从子表中删除@MapsId注释并将persistence.xml中的属性保留为,则效果很好。但这样做,我的persistent操作失败,因为openjpa无法在子表中设置父主键值
public static void main(String[] args) {
        EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("jpa-test");
        EntityManager entityManager = entityManagerFactory.createEntityManager();
        Parent parent = entityManager.find(Parent.class, 15149);
        entityManager.getTransaction().begin();
        entityManager.remove(parent);
        entityManager.getTransaction().commit();
}
Exception in thread "main" <openjpa-2.2.3-SNAPSHOT-r422266:1715851 fatal store error> org.apache.openjpa.persistence.RollbackException: The transaction has been rolled back.  See the nested exceptions for details on the errors that occurred.
FailedObject: com.entity.test.Parent-15149
    at org.apache.openjpa.persistence.EntityManagerImpl.commit(EntityManagerImpl.java:594)
    at com.test.Test.main(Test.java:76)
Caused by: <openjpa-2.2.3-SNAPSHOT-r422266:1715851 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.
FailedObject: com.entity.test.Parent-15149
    at org.apache.openjpa.kernel.BrokerImpl.newFlushException(BrokerImpl.java:2352)
    at org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:2189)
    at org.apache.openjpa.kernel.BrokerImpl.flushSafe(BrokerImpl.java:2087)
    at org.apache.openjpa.kernel.BrokerImpl.beforeCompletion(BrokerImpl.java:2005)
    at org.apache.openjpa.kernel.LocalManagedRuntime.commit(LocalManagedRuntime.java:81)
    at org.apache.openjpa.kernel.BrokerImpl.commit(BrokerImpl.java:1529)
    at org.apache.openjpa.kernel.DelegatingBroker.commit(DelegatingBroker.java:933)
    at org.apache.openjpa.persistence.EntityManagerImpl.commit(EntityManagerImpl.java:570)
    ... 1 more
Caused by: <openjpa-2.2.3-SNAPSHOT-r422266:1715851 fatal general error> org.apache.openjpa.persistence.PersistenceException: THE RELATIONSHIP R_CNRLPH RESTRICTS THE DELETION OF ROW WITH RID X'000001271B' {prepstmnt 636888566 DELETE FROM XXXXX.PARENT WHERE PRIMARY_ID = ? [params=?]} [code=-532, state=23504]SQLCA OUTPUT[Errp=DSNXRSDL, Errd=-190, 13172769, 0, 13228485, -742129664, 0]
THE RELATIONSHIP R_CNRLPH RESTRICTS THE DELETION OF ROW WITH RID X'000001271B'
FailedObject: com.entity.test.Parent-15149
    at org.apache.openjpa.jdbc.sql.DBDictionary.narrow(DBDictionary.java:4991)
    at org.apache.openjpa.jdbc.sql.DBDictionary.newStoreException(DBDictionary.java:4957)
    at org.apache.openjpa.jdbc.sql.DB2Dictionary.newStoreException(DB2Dictionary.java:571)
    at org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:136)
    at org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:78)
    at org.apache.openjpa.jdbc.kernel.BatchingPreparedStatementManagerImpl.flushBatch(BatchingPreparedStatementManagerImpl.java:221)
    at org.apache.openjpa.jdbc.kernel.BatchingConstraintUpdateManager.flush(BatchingConstraintUpdateManager.java:63)
    at org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.flush(AbstractUpdateManager.java:105)
    at org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.flush(AbstractUpdateManager.java:78)
    at org.apache.openjpa.jdbc.kernel.JDBCStoreManager.flush(JDBCStoreManager.java:732)
    at org.apache.openjpa.kernel.DelegatingStoreManager.flush(DelegatingStoreManager.java:131)
    ... 8 more
Caused by: org.apache.openjpa.lib.jdbc.ReportingSQLException: THE RELATIONSHIP R_CNRLPH RESTRICTS THE DELETION OF ROW WITH RID X'000001271B' {prepstmnt 636888566 DELETE FROM XXXXX.PARENT WHERE PRIMARY_ID = ? [params=?]} [code=-532, state=23504]
    at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.wrap(LoggingConnectionDecorator.java:219)
    at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.wrap(LoggingConnectionDecorator.java:195)
    at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.access$1000(LoggingConnectionDecorator.java:59)
    at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator$LoggingConnection$LoggingPreparedStatement.executeUpdate(LoggingConnectionDecorator.java:1134)
    at org.apache.openjpa.lib.jdbc.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:275)
    at org.apache.openjpa.jdbc.kernel.JDBCStoreManager$CancelPreparedStatement.executeUpdate(JDBCStoreManager.java:1792)
    at org.apache.openjpa.jdbc.kernel.PreparedStatementManagerImpl.executeUpdate(PreparedStatementManagerImpl.java:268)
    at org.apache.openjpa.jdbc.kernel.BatchingPreparedStatementManagerImpl.flushSingleRow(BatchingPreparedStatementManagerImpl.java:250)
    at org.apache.openjpa.jdbc.kernel.BatchingPreparedStatementManagerImpl.flushBatch(BatchingPreparedStatementManagerImpl.java:153)
    ... 13 more