2012-09-14 21 views
1

我有一個Employee類,它與Technology類具有單向多對多關係。當我向Employee添加技術併合並員工時,記錄將被添加到連接表中。合併不會從連接表中刪除

但是,當我嘗試通過合併員工來刪除技術時,更改不反映在數據庫上。

Employee.class

@Entity 
@Table(name = "EMPLOYEES") 
public class Employee implements Serializable { 

    @JoinTable(name = "EMPLOYEES_TECHNOLOGIES", 
    joinColumns = 
    @JoinColumn(name = "EMP_USERNAME", referencedColumnName = "USERNAME", table = "EMPLOYEES"), 
    inverseJoinColumns = 
    @JoinColumn(name = "TEC_ID", referencedColumnName = "ID", table = "TECHNOLOGIES")) 
    private List<Technology> technologies; 

EmployeeEAOImpl.class

@Stateless(name = "EmployeeEAO") 
public class EmployeeEAOImpl implements EmployeeEAO { 

    @PersistenceContext(unitName = "ManagedITest") 
    private EntityManager em; 

    @Override 
    public void update(Employee employee) { 
     if (employee != null) { 
      try { 
       em.merge(employee); 
       em.flush(); 
      } catch (RuntimeException ex) { 
       em.clear(); 
       throw ex; 
      } 
     } 
    } 

似乎相當標準給我。我檢查了產生疑問,當我創建/更新的技術,我得到這樣的一個員工:

INSERT INTO EMPLOYEES_TECHNOLOGIES (TEC_ID, EMP_USERNAME) VALUES (?, ?) 
    bind => [99, TEST] 

但是當我刪除員工的技術和融合,我得到無論是這個錯誤的查詢:

DELETE FROM EMPLOYEES_TECHNOLOGIES WHERE ((TEC_ID = ?) AND (EMP_USERNAME = ?)) 
    bind => [99, null] 

或者,我得到一個異常:

Exception Description: The attribute [id] of class [be.brail.entities.Employee] is mapped to a primary key column in the database. Updates are not allowed.

這讓我覺得,員工是越來越創建,因爲我沒有改變ID ,因此引發異常是因爲具有該特定ID的員工已經存在。至少,這是我的想法。

爲什麼DELETE查詢中的username參數爲空,我不知道。但我想:)

在此先感謝。

+0

猜測這不是一個簡單的問題 – mokuril

回答

0

似乎只使用連接表上的實體ID修復了它。不知道爲什麼不能引用外鍵,但它的工作原理!無論如何,這是一個更好的設計,因爲ID不能被改變。