【问题标题】:Force JPA to reload entity from database强制 JPA 从数据库重新加载实体
【发布时间】:2020-06-02 07:36:21
【问题描述】:

我有一个 Foo 实体,它以一对一的关系链接到 Status 实体:

@Entity
@NamedQueries({
  @NamedQuery(name = "Foo.findById", query = "select o from Foo o where o.fooId = :fooId")
})
public class Foo implements Serializable {
    @Id
    @Column(name="FOO_ID")
    private Long fooId;

    @OneToOne(mappedBy = "foo")
    private Status status;

    public Long getFooId() {
        return fooId;
    }

    public void setFooId(Long fooId) {
        this.fooId = fooId;
    }

    public Status getStatus() {
        return status;
    }

    public void setStatus(Status status) {
        this.status = status;
    }
}
@Entity
public class FooCurrentStatus implements Serializable {
    @Id
    private Long fooId;

    @OneToOne
    @JoinColumn(name = "FOO_ID")
    private Foo foo;

    public Long getFooId() {
        return fooId;
    }

    public void setFooId(Long fooId) {
        this.fooId = fooId;
    }

    public Foo getFoo() {
        return foo;
    }

    public void setFoo(Foo foo) {
        this.foo = foo;
        if (foo != null) {
            this.fooId = foo.getFooId();
        }
    }
}

我明白这并不是完全错误的,因为当我获取 Foo 实例时,我会自动获取它的状态。

从应用程序的角度来看,状态是只读的。它在其他地方由修改数据库信息的其他不相关进程管理。

不幸的是,副作用是每当状态更改时,我的托管实体都会过时。

如何指示 EJB/JPA 获取新状态?

【问题讨论】:

    标签: jpa refresh


    【解决方案1】:

    EntityManager API 上的refresh() 专门用于此类用例,它可以强制刷新数据库中已加载实例的状态:

    entityManager.refresh(foo.getStatus());
    

    【讨论】:

    • 我确认它有效。当我创建一个新的 foo 时,它只需要一些调整,因为 foo.getStatus()null(我用 Status.findById 命名查询解决了它)。
    • 我说得太早了。我以一种看似随机的方式得到EJB Exception: : java.lang.IllegalArgumentException: Can not refresh not managed object :-?
    • 是因为用于加载被刷新实体的entityManager已经关闭,所以被刷新的实体不再由JPA管理而分离。我相信您可以使用entityManager#merge(). 使一个分离的实体由JPA 管理您还可以首先使用entityManger#contain() 检查对象是否由JPA 管理。
    • 我的应用程序流程显然有问题,因为状态是null,由于对我来说并不明显的原因,管理或分离。但是这个答案和 cmets 中的信息是我编写解决方法所需的全部内容。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2013-01-23
    • 1970-01-01
    • 1970-01-01
    • 2021-03-06
    • 1970-01-01
    • 2019-09-22
    • 1970-01-01
    • 2013-07-21
    相关资源
    最近更新 更多