删除然后在JPA中查询失败(已删除的实体传递给持久化)

时间:2012-06-12 10:27:08

标签: java hibernate jpa seam

我有两个实体MobeeCustomer和CustomerRegion我想从CustomerRegion中删除对象我将CustomerRegion中的连接Coloumn设为null然后删除对象 来自entityManager,但我得到了例外

MobeeCustomer:

  public class MobeeCustomer implements Serialization{

  private Long id;

  private String custName;

  private String Address;

  private String phoneNo; 

  private Set<CustomerRegion> customerRegion = new HashSet<CustomerRegion>(0);


  @OneToMany(cascade = { CascadeType.PERSIST, CascadeType.REMOVE },
   fetch =    FetchType.LAZY, mappedBy = "mobeeCustomer")     
   public Set<CustomerRegion> getCustomerRegion() { 
    return CustomerRegion;  
     }

  public void setCustomerRegion(Set<CustomerRegion> customerRegion) {
      CustomerRegion = customerRegion;    
    }

  }

CustomerRegion

  public class CustomerRegion implements Serializable{

private Long id;

private String custName;

private String description;

private String createdBy;
private Date createdOn;

private String updatedBy;
private Date updatedOn;
   private MobeeCustomer mobeeCustomer;


@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "MOBEE_CUSTOMER")
public MobeeCustomer getMobeeCustomer() {
    return mobeeCustomer;
}
public void setMobeeCustomer(MobeeCustomer mobeeCustomer) {
    this.mobeeCustomer = mobeeCustomer;
}


   }

示例代码:

   if (doUpdateRegion.getStatus().equals(UserOperations.DELETE.getType())) {

custEntity = getEntityManager().find(CustomerRegion.class,doUpdateRegion.getId());


      BeanUtils.copyProperties(custEntity, doUpdateRegion);

deletedRegionsList.add(custEntity);



}


  for (CustomerRegion region : deletedRegionList) {


            region.setMobeeCustomer(null);
      getEntityManager().remove(region);
}







StackTrace:

please suggest me how to remove the CustomerRegion Object I  am getting Exception

  javax.persistence.EntityNotFoundException: deleted entity passed to persist:          [com.manam.mobee.persist.entity.CustomerRegion#<null>]
15:46:34,614 ERROR [STDERR]     at org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:613)
15:46:34,614 ERROR [STDERR]     at org.hibernate.ejb.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:299)
15:46:34,614 ERROR [STDERR]     at org.jboss.seam.persistence.EntityManagerProxy.flush(EntityManagerProxy.java:92)
15:46:34,614 ERROR [STDERR]     at org.jboss.seam.framework.EntityHome.update(EntityHome.java:64)

2 个答案:

答案 0 :(得分:0)

您正在尝试删除没有id的实体。因此,实体管理器无法在DB中找到它。这是一个独立的实体。

尝试从数据库中检索区域列表,然后再删除它们。

如果你这样做,那么这似乎是一个transaction问题。您在事务之外,因此实体与会话分离。尝试在同一个事务中执行所有操作,不要调用entityManager.remove(),只需从集合中删除项目,并在关闭事务并提交时自动刷新。

例如Spring

@Transactional(readOnly = false)
public void deleteRegions(Set<CustomerRegion> deletedRegionList){
    revion.getMobeeCustomer().getCusotmerRegion.removeAll(deletedRegionList);
}

如果该方法结束了它将提交的事务。所有修改Hibernate / JPA都会调用flush,它会将内存状态与DB同步。

答案 1 :(得分:0)

也许问题是MobeeCustomer中仍然存在对CustomerRegion的引用。如果这是问题,这应该解决它:

for (CustomerRegion region : deletedRegionList) {
      region.getMobeeCustomer().getCustomerRegion().remove(region);
      getEntityManager().remove(region);
}