0

永続化されたオブジェクトをデータベースから削除する際に問題があります。それらの間に双方向の関係を持ついくつかのテーブルがあります。まだ他のオブジェクトによって参照されているオブジェクトを削除するためのテストを行いましたが、失敗することがあります。なぜなのかわかりません。

私の関係は次のようになります。

@ManyToOne(cascade = CascadeType.ALL, targetEntity = Application.class, optional = false)
@JoinColumn(name = ModelConstants.ID_APPLICATION, nullable = false, insertable = true, updatable = true)
private Application application;

@OneToMany(cascade = CascadeType.ALL, targetEntity = Clazz.class, mappedBy = "pakage")
private List<Clazz> clazzes;

EntityManager を介して行を削除できないのはなぜですか?

私のテスト:

@Test
public void testDeleteMethodReferencedByMethodCall() {
    Application application = new Application("", "testApplication");
    Pakage pakage = new Pakage("", "testPakage", application);
    Clazz clazz = new Clazz("", "testClazz", pakage);
    Method methodCaller = new Method("testFirstMethod", "testMethodFirst",
    clazz);
    Method methodCalled = new Method("testSecondMethod", "testMethodSecond",
    clazz);
    MethodCall methodCall = new MethodCall(methodCaller, methodCalled);
    DatabaseUtils.persistObject(entityManager, methodCall);

    assertEquals(2, getCountRows("m", entityMethod));
    assertEquals(1, getCountRows("mc", entityMethodCall));

    DatabaseUtils.removeObject(entityManager, methodCall);
    assertEquals(0, getCountRows("m", entityMethod));
    assertEquals(0, getCountRows("mc", entityMethodCall));
}

オブジェクトの削除:

public static void removeObject(EntityManager entityManager,
  DatabaseElement databaseElement) {
    entityManager.getTransaction().begin();
    entityManager.remove(databaseElement);
    entityManager.getTransaction().commit();
}

例外:

javax.persistence.RollbackException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.4.1.v20121003-ad44345): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: org.postgresql.util.PSQLException: ERROR: update or delete on table "pakage" violates foreign key constraint "fk_clazz_id_pakage" on table "clazz"
Detail: Key (id_pakage)=() is still referenced from table "clazz".
Error Code: 0
Call: DELETE FROM public.pakage WHERE (id_pakage = ?)
    bind => [1 parameter bound]
Query: DeleteObjectQuery(Pakage[id_pakage = , name_pakage = testPakage, Application[id_application = , name_application = testApplication]]) at 
4

1 に答える 1

1

解決策を見つけました。削除する前にオブジェクトの更新を呼び出すと、すべて正常に動作します。

このような:

entityManager.refresh(databaseElement);
entityManager.remove(databaseElement);

バックグラウンドでいくつかのキャッシングが機能している可能性があり、オブジェクトに正しい関連付けがある場合もあれば、そうでない場合もありますが、よくわかりません。

于 2013-04-14T22:24:14.780 に答える