0

我有一个在应用程序开始时加载的配置表。如果我更改数据库表上的任何值,它不会反映在应用程序上,它会再次进行查询。

    @Stateless()
@LocalBean()
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public class DatosConfiguracionDAO {
    private static final Logger log = Logger.getLogger(DatosConfiguracionDAO.class);
    @PersistenceContext(unitName = Constantes.Conexiones.UNIT_PLACSP)
    private EntityManager em;
    
    
    public List<ConfiguracionEntity> findAllConfiguracion() throws GeacoPlacspException {
        try {
            
            TypedQuery<ConfiguracionEntity> query = em.createNamedQuery("ConfiguracionEntity.findAll",
                    ConfiguracionEntity.class);
            return query.getResultList();
        }catch(Exception e) {
            log.error("findAllConfiguracion" + e);
            throw new GeacoPlacspException(ErrorType.ERROR104,e.getMessage());
        }
    }

}

实体

   @Entity
        @Table(name=NOMBRE_TABLA_CONFIGURACION)
        @NamedQuery(name="ConfiguracionEntity.findAll", query="SELECT c FROM ConfiguracionEntity c")
        public class ConfiguracionEntity extends BaseEntity implements Serializable {
}

我正在使用 weblogic 12,重新启动 weblogic 是更新应用程序中的值的唯一方法

4

1 回答 1

0

一个实体在 PersistanceContext 中,它不会持续检查实体在数据库中的状态(缓存)。换句话说,它看不到在 PersistanceContext 之外所做的更改。因此,您需要通过em.refresh()从数据库重新加载实体的最新状态来刷新您的 entityManger。

另外,请记住,对于尚未持久化、删除或分离的实体使用此方法IllegalArgumentException将被抛出。

另一种解决方案是在通过以下方式获取实体的最新状态之前简单地清除缓存:

em.getEntityManagerFactory().getCache().evictAll()

PS:我不知道为什么你确实需要在 PersistanceContext 之外更改实体的状态并在上下文中查看结果,但这似乎是代码异味。

于 2021-01-25T09:13:15.453 回答