【问题标题】:EntityManager remove() call not updating databaseEntityManager remove() 调用不更新数据库
【发布时间】:2013-04-28 12:52:09
【问题描述】:

我有一个使用 JPA 的基本 Java 项目设置。我有正确注释的类,可以毫无问题地将数据插入到我的 PostgreSQL 数据库中。

我的问题……我可能会发现我需要在这里添加更多细节……

我是在调用“em.remove(myObject)”,其中“em”是一个 EntityManager。我可以在调试时看到对象的更改,但在应用程序完成后,我的更改不会反映在数据库中。

.remove() 调用会更新数据库还是我还需要添加 .flush() 调用?我试过用谷歌搜索这个,一定是遗漏了一些东西。

谢谢!

【问题讨论】:

  • 您是否在删除之前在同一事务中从数据库中读取对象?
  • 是的,它是同一事务的一部分。
  • 如果它不是一个分离的实例,那么删除调用应该可以工作。如果它已分离,您需要先使用 Object managed = em.merge(myObject); 对其进行管理,然后在 managed 上调用 remove。
  • 谢谢克拉夫。我会试一试。
  • 如果您在交易中执行此操作,您是否在最后提交交易?

标签: java hibernate jpa persistence entity


【解决方案1】:

我发现我还需要定义一个级联类型。

@ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "QUESTION_ID", nullable = false)
    private Question question; 

【讨论】:

  • 如果您希望 remove 也删除关联的 Question 对象,则应仅添加级联。 cascade.REMOVE 意味着 myObject 上的删除也将在 Question 对象上执行
【解决方案2】:

remove 调用应该从数据库中删除实体。但是,根据您的缓存设置,这可能不会立即发生。而且,如果您有一些会因删除而违反的约束,那么当它尝试更新数据库时,它将引发异常并且删除将失败。如果您确实需要保证它立即发生或失败,那么是的,您需要致电flush

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-10
    • 2013-06-18
    • 2021-06-29
    相关资源
    最近更新 更多