我的代码中涉及Java(JPA)中的数据持久性的错误让我发疯了。我没有开发这个,我对这个框架一无所知,所以,对于我未能提供的任何信息,请提前道歉。
有问题的错误是使用 EntityManager.createQuery(在表上简单地选择)创建的查询返回不一致的结果。也就是说,如果我通过界面更改一个值,保存更改,然后一次又一次地重新加载浏览器,有时会看到新值,有时会看到旧值。似乎没有发生这种情况的模式,因为我知道它是随机的。虽然发生这种情况,但如果我查询 MySQL 数据库,我总是会看到正确的值(“新”值)。
我什至不知道我应该看什么。从注释如下的类中检索不一致的值:
@ManagedBean
@ViewScoped
public class DivisoreVolumenticoView implements Serializable {
并且此 EntityManager.createQuery 返回的对象类型注释如下:
@ManagedBean
@Entity
@Table(name = "divisore_volumetrico")
public class DivisoreVolumetricoBean implements Serializable {
其中不一致的属性(尽管其中任何一个都会发生这种情况)是:
@Column(name = "nazionale")
private Double nazionale;
还有一堆其他方法被注释为@Transient,属性的getter和setter没有任何注释。
调用 createQuery 的 EntityManager 是从下面的类中检索的(当我在本地环境中执行此操作时,每次浏览器刷新时有时会创建一个新对象,有时则不会创建):
public class EMHelper {
private static final EntityManagerFactory emf;
private static final ThreadLocal<EntityManager> threadLocal;
static {
emf = Persistence.createEntityManagerFactory("persistenceUnit");
threadLocal = new ThreadLocal<EntityManager>();
}
public static EntityManager getEntityManager() {
EntityManager em = threadLocal.get();
if (em == null) {
em = emf.createEntityManager();
threadLocal.set(em);
}
return em;
}
如果您至少可以为我指明正确的方向,我将不胜感激。例如:既然数据库中的值始终是正确的,我是否应该假设更改的持久性没有问题?或者问题是否存在并且检索它时的不一致只是一个症状?
提前致谢。