2012-12-09 106 views
0

這裏的情況是: 我有2個實體交易和客戶: - 一個客戶端關聯到一個商人 - 一個商人可以在刪除使用EntityManager的交易者可以關聯到一個或多個客戶端 。刪除(t)然後提交,所有與該交易者相關的客戶端都會自動刪除。這很好,因爲它是級聯刪除。 問題:刪除對級聯的EntityManager

1 - 如何刪除我的交易者並重新將其客戶端重新設置爲另一個客戶端?

2 - 解決方案駐留在mySQL中的級聯效應是否失效,或駐留在entityManager和MySQL中? 非常感謝您的幫助。

客戶實體

public class Client implements Serializable { 
    @Transient 
    private PropertyChangeSupport changeSupport = new PropertyChangeSupport(this); 
    private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Basic(optional = false) 
    @Column(name = "id_client") 
    private Integer idClient; 
    @Column(name = "id_portefeuille") 
    private Integer idPortefeuille; 
    @Column(name = "id_entreprise") 
    private Integer idEntreprise; 
    @Column(name = "id_trader") 
    private Integer idTrader; 
    //other attributes 
    @JoinColumn(name = "id_trader", referencedColumnName = "id_trader", updatable = false, insertable = false) 
    @ManyToOne 
    private Trader idTrader2; 
    //getters and setters 

交易實體

public class Trader implements Serializable { 
     @Transient 
     private PropertyChangeSupport changeSupport = new PropertyChangeSupport(this); 
     private static final long serialVersionUID = 1L; 
     @Id 
     @GeneratedValue(strategy = GenerationType.IDENTITY) 
     @Basic(optional = false) 
     @Column(name = "id_trader") 
     private Integer idTrader; 
     @Column(name = "nom") 
     //other attributes 
     @OneToMany(cascade = CascadeType.ALL, mappedBy = "idTrader2") 
     private Collection<Client> clientCollection; 
     //getters and setters 

主代碼

//Getting The trader selected in a JTable   
Trader t = traderList.get(tableTrader.getSelectedRow()); 

for (Iterator<Client> it = t.getClientCollection().iterator(); it.hasNext();) { 

      //Getting the Clients releated to this trader 
      Client c = it.next(); 

      //Affecting the client to an other trader 
      // i chose an existing one randomly 
      c.setIdTrader2(traderList.get(2)); 
      traderList.get(2).getClientCollection().add(c); 

      it.remove(); 
    } 
      entityManager.flush(); 
      entityManager.remove(t); 
     } 

回答

0

應該沒有在級聯刪除配置,無論是在MySQL不是在實體映射。因此,該方法是這樣的(假設有一個雙向關聯,以及泰德getClients()直接返回持久列表,而不進行防禦性複製或包成未修改代理):

public void deletedTrader(Trader toDelete, Trader newAssignedTrader) { 
    for (Iterator<Client> it = toDelete.getClients().iterator(); it.hasNext();) { 
     Client c = it.next(); 
     c.setTrader(newAssignedTrader); 
     newAssignedTrader.getClients().add(c); 
     it.remove(); 
    } 
    em.remove(toDelete); 
} 
+0

1 THX烏拉圭回合的答覆。 – WOlF

+0

1st thx for ur reply 我試圖管理實體引用,因爲你顯示它,我得到這個異常com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:無法刪除或更新父行:外鍵約束失敗 做你認爲我應該在刪除交易者之前合併新客戶端的法定條款嗎? – WOlF

+0

只需在調用em.remove(toDelete)前添加'em.flush();'。 –