1

我的代码中涉及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;
    }

如果您至少可以为我指明正确的方向,我将不胜感激。例如:既然数据库中的值始终是正确的,我是否应该假设更改的持久性没有问题?或者问题是否存在并且检索它时的不一致只是一个症状?

提前致谢。

4

0 回答 0