JPA 2.0:问题:orphanRemoval使用Open JPA

时间:2017-03-12 16:44:31

标签: java jpa openjpa

请求帮助解决使用JPA 2.0删除级联的奇怪问题。请在下面找到详细信息 我正在使用与RAD一起提供的IBM Websphere 8.5捆绑的JPA。 我面临的问题是当我尝试删除与另一个实体具有一对多关系的实体时,我总是遇到ORA-02292:完整性约束违规。以下是突出显示两个实体之间关系的具体部分 - FeeForService和FeeForServiceProduct。 FeeForService与FeeForServiceProduct具有一对多关系。 请注意,当我在Websphere服务器上运行它时会出现问题。我已经尝试将下面的程序作为一个独立的程序运行,它适用于在多端放置级联属性并调用em.remove()两次的变通方法

@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;
....

}

@Entity
   @Table(name="FEE_FOR_SERVICE_PRODUCT")
   public class FeeForServiceProduct implements Serializable {
    ....
    ....
    //bi-directional many-to-one association to FeeForService
     @ManyToOne(cascade={CascadeType.ALL})
     @JoinColumn(name="FEE_FOR_SERVICE_ID")
     private FeeForService feeForService;
   }

最初我曾尝试过只使用CASCADE = CASCADEType.ALL属性,但因为它不能使用orphanRemoval。

我收到的错误是java.sql.SQLIntegrityConstraintViolationException:ORA-02292:违反了完整性约束。找到儿童记录。

下面是我用于删除FFS实体的代码示例,假设通过将orphanRemoval设置为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,我可以通过仅调用父实体上的删除操作来删除所有依赖实体,如果有,请指出我出错的地方因为我的理解到目前为止这是必须的可以通过在拥有实体上将orphanRemoval设置为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>

先谢谢

0 个答案:

没有答案
相关问题