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();
}