合并不会从连接表中删除

时间:2012-09-14 09:32:53

标签: java-ee jpa

我有一个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;
            }
        }
    }

对我来说似乎很标准。我检查了生成的查询,当我使用技术创建/更新Employee时,我得到了这个:

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

但是当我从Employee中删除技术并合并时,我得到了这个错误的查询:

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参数为null,我不知道。但我想:)

提前致谢。

1 个答案:

答案 0 :(得分:0)

似乎只在连接表上使用实体ID来修复它。不知道为什么不能引用外键,但它有效!这是一个更好的设计,因为id不能改变。