我有一个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,我不知道。但我想:)
提前致谢。
答案 0 :(得分:0)
似乎只在连接表上使用实体ID来修复它。不知道为什么不能引用外键,但它有效!这是一个更好的设计,因为id不能改变。