我正在构建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);
}
如果有人可以帮助我,我将非常感激。
谢谢。