Session 使用JPA加载后如何更新会话属性

Session 使用JPA加载后如何更新会话属性,session,servlets,jpa-2.0,session-variables,Session,Servlets,Jpa 2.0,Session Variables,我在用JPA加载一些数据后更新会话属性时遇到问题 我设置/获取会话属性: request.getSession().setAttribute("user", user); User user = (User) request.getSession().getAttribute("user"); 在应用程序中的某个地方,我从数据库中加载用户列表(包含与会话属性相同的用户)。一切都会好的,我会得到最新的信息,但如果我能从会话属性中得到,就不会。 我不希望请求数据库提供几乎静态的信息,但另一方面,

我在用JPA加载一些数据后更新会话属性时遇到问题

我设置/获取会话属性:

request.getSession().setAttribute("user", user);

User user = (User) request.getSession().getAttribute("user");
在应用程序中的某个地方,我从数据库中加载
用户列表
(包含与会话属性相同的
用户
)。一切都会好的,我会得到最新的信息,但如果我能从会话属性中得到,就不会。 我不希望请求数据库提供几乎静态的信息,但另一方面,我不知道如何更新会话属性

存储会话的属性可能是非常不正确的实现

更新 这个解决方案怎么样:

我有会话属性的缓存

public static final HashMap<String, HashMap<String, Object>> sessionAttributeMaps = new HashMap<>(); 

public static final HashMap<String, HashMap<String, Object>> sessionAttributeMapsForUpdate = new HashMap<>();
sessionAttributeMaps(用于多个创建的会话):

[ [会话1:[{“用户”:用户1},{“客户”:客户1}]]

[会话2:[{“用户”:用户1},{“客户”:客户2}]]

[会话3:[{“用户”:用户2},{“客户”:客户1}] ]

sessionAttributeMapsForUpdate
中,我存储会话属性的实际值(当它们被更改时,我将在映射中检查它在POJO实体中实现的所有会话)

警告
设置会话属性(“用户”,值)
wihout
removeSessionAttribute(“用户”)不工作,因为新的
等于会话映射中的
(但是
!=

所以,当我使用helper获取会话属性时,我使用实际值


可能已经有类似my的解决方案,但经过时间测试?

要更新会话,请调用
request.getSession().setAttribute(“user”,user)再次更新用户。我有另一个问题。我更新用户列表,并希望更新所有会话中的每个用户。我尝试使用
HttpSessionAttributeListener
和静态列表来实现更新方案,以存储会话和属性映射。当我从session属性中获取值时,我也会与这个atatic列表进行比较,如果值
等于
,则更改session属性=。这是可行的,但非常困难。第二个问题-我无法刷新分离的实体。如果此数据几乎是静态的,为什么不使用JPA L2缓存?是很好的参考资料。二级缓存可以让您看到应用程序内所做的更改,而失效策略可以用于查看JPA外所做的更改。@Chris我认为这也是最好的解决方案(包装属性的获取者并通过JPA获取值)。我查了一下,事实上,数据库没有被点击。所以会话属性只需要作为对数据库的引用。谢谢没有问题了。
@WebListener
public class SessionAttributeListener implements HttpSessionAttributeListener{

    @Override
    public void attributeAdded(HttpSessionBindingEvent event) {
        String SessionId = event.getSession().getId();
        String attributeName = event.getName();        
        Object attributeValue = event.getValue();    

        if (attributeName.equalsIgnoreCase("user")) {
            HashMap<String, Object> hm = ServletUtil.sessionAttributeMaps.get(SessionId);
            if (hm==null) {
                hm = new HashMap<String, Object>();
                ServletUtil.sessionAttributeMaps.put(SessionId, hm);
            }
            hm.put("user", attributeValue);
        }
    }
    ...
}
public void fireChanges() {    
    for (Entry<String, HashMap<String, Object>> sessionAttributesMap : servlets.ServletUtil.sessionAttributeMaps.entrySet()) {
        for (Entry<String, Object> entry : sessionAttributesMap.getValue().entrySet()) {
            if (this.equals(entry.getValue()) && this!=entry.getValue()) {
                entry.setValue(this);
                HashMap<String, Object> hm = ServletUtil.sessionAttributeMapsForUpdate.get(sessionAttributesMap.getKey());
                if (hm==null) {
                    hm = new HashMap<String, Object>();
                    ServletUtil.sessionAttributeMapsForUpdate.put(sessionAttributesMap.getKey(), hm);
                }
                hm.put("user", this);
            }
        }
    }
}
public static Object getSessionAttribute(String key) {

    Object value = FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get(key);

    if (key.equalsIgnoreCase("user")) {
        if (!ServletUtil.sessionAttributeMapsForUpdate.isEmpty()) {
            HttpSession hs = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
            HashMap<String, Object> hm = ServletUtil.sessionAttributeMapsForUpdate.get(hs.getId());    
            if (hm!=null) {
                User u = (User) hm.get("user");
                if (u!=null) {
                    value = u;
                    removeSessionAttribute("user");
                    setSessionAttribute("user", value);

                    hm.remove("user");
                }
                if (hm.isEmpty()) {
                    ServletUtil.sessionAttributeMapsForUpdate.remove(hs.getId());
                }
            }
        }
    }

return value;
}