我收到此警告:“类RepeatableWriteUnitOfWork已在刷新”,如何解决?

时间:2019-09-11 07:53:28

标签: java jpa eclipselink

我正在构建Java Web应用程序以实现共同健康保险。

我正在将Eclipselink 2.7.4与SQL Server数据库结合使用。

启动应用程序时,一切正常。

一段时间(3小时)后,UPDATE和INSERT请求不再运行。 我在日志中看不到任何UPDATE和INSERT请求。 我的日志中没有错误,JPA实体不持久。

我在每次SELECT时都收到此警告:

  

RepeatableWriteUnitOfWork类已经在刷新。查询将被执行,而无需将进一步的更改写入数据库。如果查询以更改的数据为条件,则更改可能不会反映在结果中。用户应在完成相关更改后并在此flush()之前发出flush()调用,以确保结果正确。

如果我们重新启动应用程序,一切将再次正常运行。

有20个用户在使用该应用。

我的存储库类:

package com.abildoc.shared.db.dao.impl;

import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import javax.persistence.EntityManager;

import org.apache.deltaspike.jpa.api.transaction.Transactional;

import com.abildoc.shared.db.dao.AbstractRepository;
import com.abildoc.shared.db.dao.DbAbildoc;

/**
 * @author abildoc
 *
 */
@ApplicationScoped
@Transactional
public class RepositoryAbildoc extends AbstractRepository {

    @Inject
    @DbAbildoc
    EntityManager entityManager;

    @Override
    public EntityManager getEntityManager() {
        return entityManager;
    }
}

AbstractRepository类:

package com.abildoc.shared.db.dao;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.persistence.Entity;
import javax.persistence.EntityManager;
import javax.persistence.Query;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

/**
 * @author abildoc
 *
 */
public abstract class AbstractRepository {

    protected Logger logger = LogManager.getLogger("ABLogger");

    private static final String HINT_REFRESH = "eclipselink.refresh";

    /***************************************************************************/
    /***************************************************************************/
    public void create(Object obj) {
        getEntityManager().persist(obj);
    }

    /***************************************************************************************************/
    /***************************************************************************************************/
    public <T> T read(int id, Class<T> cls) {
        return getEntityManager().find(cls, id);
    }

    /***************************************************************************************************/
    /***************************************************************************************************/
    public <T> T update(T obj) {
        return getEntityManager().merge(obj);
    }

    /***************************************************************************************************/
    /***************************************************************************************************/
    public void delete(Object obj) {
        getEntityManager().remove(getEntityManager().contains(obj) ? obj : getEntityManager().merge(obj));
    }

    /***************************************************************************************************/
    /***************************************************************************************************/
    public Object queryObject(String nameQuery, Map<String, Object> prop) {
        Object obj = null;
        try {
            Query query = getEntityManager().createNamedQuery(nameQuery).setHint(HINT_REFRESH, "true");

            if (prop != null) {
                for (Map.Entry<String, Object> entry : prop.entrySet()) {
                    String key = entry.getKey();
                    Object value = entry.getValue();
                    query.setParameter(key, value);
                }
            }

            obj = query.getSingleResult();

            if (obj.getClass().getAnnotation(Entity.class) != null) {
                getEntityManager().detach(obj);
            }

        } catch (Exception e) {
            logger.catching(e);
        }

        return obj;
    }

    /***************************************************************************************************/
    /***************************************************************************************************/
    @SuppressWarnings("unchecked")
    public <T> List<T> queryList(String nameQuery, Map<String, Object> prop) {
        try {
            Query query = getEntityManager().createNamedQuery(nameQuery).setHint(HINT_REFRESH, "true")
                    .setMaxResults(1000);

            if (prop != null) {
                for (Map.Entry<String, Object> entry : prop.entrySet()) {
                    String key = entry.getKey();
                    Object value = entry.getValue();
                    query.setParameter(key, value);
                }
            }

            return detachEntities(query.getResultList());

        } catch (Exception e) {
            logger.catching(e);
            return new ArrayList<>();
        }
    }

    /***************************************************************************************************/
    /***************************************************************************************************/
    @SuppressWarnings("unchecked")
    public <T> List<T> readAll(Class<T> cls) {
        Query query = getEntityManager().createQuery("SELECT e FROM " + cls.getName() + " e")
                .setHint(HINT_REFRESH, "true").setMaxResults(1000);

        return detachEntities(query.getResultList());
    }

    @SuppressWarnings("unchecked")
    public <T> List<T> executeQuery(String query) {
        Query q = getEntityManager().createNativeQuery(query).setMaxResults(1000);

        return detachEntities(q.getResultList());
    }

    public Object executeQueryObject(String query) {
        Query q = getEntityManager().createNativeQuery(query);
        return q.getSingleResult();
    }

    /**
     * Par exemple un update ou un delete
     * 
     * @param query
     */
    public void executeQueryNoResult(String query) {
        Query q = getEntityManager().createNativeQuery(query).setMaxResults(1000);
        q.executeUpdate();
    }

    public <T> List<T> detachEntities(List<T> list) {

        for (T obj : list) {
            try {
                getEntityManager().detach(obj);
            } catch (Exception e) {
                //
            }
        }

        return list;

    }

    protected abstract EntityManager getEntityManager();

}

未触发更新时:

private boolean enregistrerValidation(DocGestionValideur valideur) {

        boolean succes = true;

        logger.debug("Enregistrement de la validation pour le valideur " + valideur);

        valideur.setCommentaire(documentGestionChoisi.getCommentaire());
        valideur.setStatut(DocGestionValideur.STATUT_VALIDATION_EFFECTUEE);
        valideur.setHandleUserValideur(uCourant.getHandle().toString());
        valideur.setDateTraitement(new Date());

        repoAbildoc.update(valideur);
}

如果有人可以帮助我,我将非常感激。

谢谢。

0 个答案:

没有答案