Java Web应用程序使用EclipseLink无法从数据库中获取实际数据

Java Web应用程序使用EclipseLink无法从数据库中获取实际数据,java,jsf,websocket,jax-rs,eclipselink,Java,Jsf,Websocket,Jax Rs,Eclipselink,我有一个数据库和用户表 ------------------------------------------------------------------------------- | id (pk) | name | role | -----------------------------------------------------------------------------

我有一个数据库和用户表

-------------------------------------------------------------------------------
|   id (pk)             |   name                      |      role              |
-------------------------------------------------------------------------------
|   1                   |   Adam                      |           1            |
--------------------------------------------------------------------------------
|   2                   |   Jack                      |           2            |
我使用数据库中的EclipseLink获取了所有用户,并使用JSF和Facelets将其显示在web应用程序中。我可以编辑它们,添加新用户,一切正常

后端:

public void getAvialableUsers() {
    List<DctInternalUsers> activeInternalUsersList = new ArrayList<>();
    activeInternalUsersList = crossInterfaceJSFBean.getSettingsBean().getAllUsers();
}
这里一切正常,数据成功添加到数据库。之后,当我收到来自websockets的消息时,我会转到数据库并再次尝试获取所有用户:

public void updateUsers() {
    activeInternalUsersList = crossInterfaceJSFBean.getSettingsBean().getAllUsers();
}
这就是问题所在。我只接收在first select中获得的用户。新添加的用户不会上载到Web应用程序。问题是,当新用户从Web服务中添加时,如何从数据库中获取新用户? 查询:


概要:可以通过eclipselink从web应用程序和web服务添加用户。WS通过WebSocket向web应用程序发送消息。试图从数据库加载用户但仅接收旧用户的消息。新用户仅在应用程序重新启动后出现

您是否在事务中?更改仅在关联事务的刷新或提交期间同步到数据库,并且仅在提交后对其他线程可见。看起来像是缓存问题。试试@Cacheisolation=CacheIsolationType.ISOLATED,看看我在使用EJB,它控制事务。我需要刷新以同步它们?检查数据库,确保“合并”实际上正在表中插入实体,因为您无法读取未插入的实体。EJB不控制事务,您仍然必须在需要它们的时候进行划分,并且您所显示的任何内容都不意味着这在事务中发生。Em.flush将抛出一个异常,明确指出如果未在事务中执行,您将丢失某些内容。@Cacheisolation=CacheIsolationType.ISOLATED已工作,谢谢!
@Path("/addUser")
@POST
@Consumes("application/json; charset=UTF-8")
public String getUserInfo(String json) {
    try {
        JSONObject json = new JSONObject(json);

        User user = new User();
        user.setName(json.getString("name"));
        user.setRole(json.getInt("role"));

        entityManager.merge(user);

        for(Session session : sessions) {
        RemoteEndpoint.Basic endpoint = session.getBasicRemote();
        try {
            endpoint.sendText(message);
        }
        catch(IOException ioe) {
            LOG.warn("Unable to send message to session\n Message:" + 
            ioe.getMessage());
        }
    }
}
public void updateUsers() {
    activeInternalUsersList = crossInterfaceJSFBean.getSettingsBean().getAllUsers();
}
@NamedQuery(name = "Users.findAll", query = "SELECT d FROM Users d")

public List<Users> getAllUsers() {
    TypedQuery query = em.createNamedQuery("Users.findAll", Users.class);
    return query.getResultList();
}