Java JPA2.0:问题:使用Open JPA引发完整性冲突
请求帮助解决JPA 2.0的级联删除这一奇怪问题。请查看以下详细信息 我使用的是与RAD一起提供的IBMWebSphere8.5捆绑的JPA。 我面临的问题是,当我尝试删除与另一个实体具有一对多关系的实体时,我总是会遇到ORA-02292:完整性约束冲突。下面是突出显示两个实体之间关系的特定部分—FeeForService和FeeForServiceProduct。 FeeForService与FeeForServiceProduct有一对多的关系。 请注意,当我在Websphere服务器上运行它时,会出现此问题。我试着将下面的作为一个独立的程序运行,它可以解决在多个端放置一个cascade属性并调用em.remove两次的问题Java JPA2.0:问题:使用Open JPA引发完整性冲突,java,jpa,openjpa,Java,Jpa,Openjpa,请求帮助解决JPA 2.0的级联删除这一奇怪问题。请查看以下详细信息 我使用的是与RAD一起提供的IBMWebSphere8.5捆绑的JPA。 我面临的问题是,当我尝试删除与另一个实体具有一对多关系的实体时,我总是会遇到ORA-02292:完整性约束冲突。下面是突出显示两个实体之间关系的特定部分—FeeForService和FeeForServiceProduct。 FeeForService与FeeForServiceProduct有一对多的关系。 请注意,当我在Websphere服务器上运行
@Entity
@Table(name="FEE_FOR_SERVICE")
public class FeeForService implements Serializable {
private static final long serialVersionUID = 1L;
....
....
//bi-directional many-to-one association to FeeForServiceProduct
@OneToMany(mappedBy="feeForService",cascade={CascadeType.ALL},orphanRemoval=true)
private Set<FeeForServiceProduct> feeForServiceProducts;
....
起初,我只尝试使用CASCADE=CASCADEType.ALL属性,但由于不起作用,我不得不使用孤儿移除
我收到的错误是java.sql.SQLIntegrityConstraintViolationException:ORA-02292:违反了完整性约束。找到子记录
下面是我用于删除FFS实体的代码示例,假设通过将OliverRemoving设置为true,我不必显式删除FFSProduct实体。但这似乎不起作用
public void testDeleteFFS(){
EntityManagerFactory entityManagerFactory=Persistence.createEntityManagerFactory("DummyTestService");
EntityManager em=entityManagerFactory.createEntityManager();
long crVO=3658;
List<FeeForService> ffsExisting=(List<FeeForService>) em.createQuery("SELECT i FROM FeeForService i INNER JOIN i.customerRequest u where u.customerRequestId="+crVO).getResultList();
System.out.println("begin of delete");
//for deleting child entity FFSProduct
for(FeeForService ffsCandidate:ffsExisting){
em.getTransaction().begin();
em.remove(ffsCandidate);
em.getTransaction().commit();
}
/*for deleting parent entity FFS as the FFSProduct entity was retained when a single for loop was used*/
for(FeeForService ffsCandidate:ffsExisting){
em.getTransaction().begin();
em.remove(ffsCandidate);
em.getTransaction().commit();
}
System.out.println("End of delete");
}
JPA 2.0是否有任何方法可以通过仅调用父实体上的移除操作来删除所有依赖实体,如果是,请指出我的错误之处,因为我到目前为止的理解是,必须通过将拥有实体上的孤儿移除设置为true来实现这一点
另外请注意,Cascade=CascadeType.ALL是在FFS产品或关系的多个端给出的,因为没有它,解决方案就无法工作。正如我在顶部提到的,当作为独立运行时,它似乎奇怪地工作
我的persistence.xml属性如下
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="DummyTestService" transaction-type="RESOURCE_LOCAL" >
<class>FeeForService</class>
<class>FeeForServiceProduct</class>
<validation-mode>NONE</validation-mode>
<properties>
<property name="openjpa.ConnectionURL" value="jdbc:oracle:thin:@xxxx"/>
<property name="openjpa.ConnectionDriverName" value="oracle.jdbc.OracleDriver"/>
<property name="openjpa.ConnectionUserName" value="xxxx"/>
<property name="openjpa.ConnectionPassword" value="xxxx"/>
<property name="openjpa.RuntimeUnenhancedClasses" value="supported" />
<!-- <property name="openjpa.DynamicEnhancementAgent" value="true"/> -->
<property name="openjpa.Log" value="File=D:\XXXX\JPAstandalonelog,DefaultLevel=WARN, Tool=INFO,SQL=TRACE"/>
</properties>
</persistence-unit>
提前感谢您的代码很难理解。我只能看到ffs,ffs…ffs。我不知道OpenJPA的细节,但孤儿删除是JPA2.1的一个特性,在2.0中不可用。也许在persistence.xml上使用2.0会迫使它进入遵从性模式。
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="DummyTestService" transaction-type="RESOURCE_LOCAL" >
<class>FeeForService</class>
<class>FeeForServiceProduct</class>
<validation-mode>NONE</validation-mode>
<properties>
<property name="openjpa.ConnectionURL" value="jdbc:oracle:thin:@xxxx"/>
<property name="openjpa.ConnectionDriverName" value="oracle.jdbc.OracleDriver"/>
<property name="openjpa.ConnectionUserName" value="xxxx"/>
<property name="openjpa.ConnectionPassword" value="xxxx"/>
<property name="openjpa.RuntimeUnenhancedClasses" value="supported" />
<!-- <property name="openjpa.DynamicEnhancementAgent" value="true"/> -->
<property name="openjpa.Log" value="File=D:\XXXX\JPAstandalonelog,DefaultLevel=WARN, Tool=INFO,SQL=TRACE"/>
</properties>
</persistence-unit>