java - 使用实体管理器删除有时会失败

标签 java database postgresql eclipselink persistent

我在从数据库中删除持久对象时遇到问题。我有一些表之间具有双向关系。我有一个测试,用于删除仍被其他对象引用的对象,但有时会失败。我不明白为什么会这样。

我的人际关系是这样的:

@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();
}

异常(exception):

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 

最佳答案

我找到了解决方案:如果我在删除之前调用对象的刷新,那么一切都会正常工作。

像这样:

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

也许一些缓存在后台工作,有时我在对象中具有正确的关联,有时则没有,但我不确定。

关于java - 使用实体管理器删除有时会失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16003683/

相关文章:

python - 使用 Django 从数据库中预填充 HTML 表单表

python - 使用 HAVING 选择 SQLAlchemy 列的计数和值

java - 对 Java 8 流的无干扰要求

java - 我可以将 Skype 与我的 Android 应用程序链接吗?

mysql - 更改 MySQL 数据库的编码

php - 是否有用于 PHP 的数据库连接框架或库?

sql - 当条件依赖于关系属性时如何搜索模型

sql - Postgresql:在更新时替换部分字符串

java - 将计数器应用于列表中的项目

java - 如何在多核上线性扩展 NodeJS?