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;
従業員EAOImpl.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 クエリのユーザー名パラメーターが null である理由はわかりません。しかし、私はしたい:)
前もって感謝します。