2012-06-12 42 views
0

我有兩個實體MobeeCustomer和CustomerRegion我想先從CustomerRegion中刪除對象我把加入Coloumn在CustomerRegion是null然後從entityManager中刪除對象 但Iam越來越異常刪除然後JPA查詢失敗(刪除的實體傳遞到持久)

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) 
+0

如何獲取列表? – ssedano

+0

我看到你是新的在stackoverflow,也許你可以[看看常見問題,看看如何upvote和接受答案](http://stackoverflow.com/faq#howtoask) – Pablo

回答

0

您正在試圖刪除沒有id的實體。因此,實體經理無法在數據庫中找到它。這稱爲分離的實體。

嘗試從數據庫中檢索區域列表,然後刪除它們。

如果你這樣做,那麼這看起來像一個transaction問題。您在事務之外,因此實體與會話分離。嘗試在同一個事務中完成所有操作,並且不要調用entityManager.remove(),只需從集合中移除該項目,並且在關閉事務並提交時,刷新將自動完成。

例如與Spring

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

如果該方法結束,將提交事務。所有修改Hibernate/JPA結束調用一個刷新,同步內存的狀態與數據庫。

+0

他如何刪除實體從數據庫如果他沒有調用remove? – Pablo

+0

,因爲當事務結束時,所有的修改JPA調用一個flush,它將內存的狀態與數據庫同步。當這些實體變成孤兒時,如果配置合適,對象將被刪除 – ssedano

+0

在CustomerRegion中,mobeeCustomer可以爲空,且ID爲長。在我看來,如果沒有MobeeCustomer,CustomerRegion可以存在,所以他們不會成爲孤兒。 – Pablo

0

也許問題是在MobeeCustomer中仍然存在對CustomerRegion的引用。如果這是問題,這應該解決它:

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

謝謝你很胖巴勃羅 – nag