1

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 である理由はわかりません。しかし、私はしたい:)

前もって感謝します。

4

1 に答える 1

0

結合テーブルでエンティティIDのみを使用すると修正されたようです。外部キーへの参照がない理由はわかりませんが、機能します。IDは変更できないため、とにかく優れた設計です。

于 2012-09-17T11:19:02.817 に答える