强制 JPA 从数据库重新加载实体
Force JPA to reload entity from database
我有一个 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 获取新状态?
EntityManager
API 上的 refresh()
特别用于此类用例,它可以强制从数据库中刷新已加载实例的状态:
entityManager.refresh(foo.getStatus());
我有一个 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 获取新状态?
EntityManager
API 上的 refresh()
特别用于此类用例,它可以强制从数据库中刷新已加载实例的状态:
entityManager.refresh(foo.getStatus());