【问题标题】:Loading social graph in Spring/Hibernate - Hibernate session duration在 Spring/Hibernate 中加载社交图 - 休眠会话持续时间
【发布时间】:2012-03-08 19:05:18
【问题描述】:

我的应用使用社交图谱。每个人对象都有一个与该人相关的其他人的多对多列表。我的信念是,通过使用@ManyToMany(fetch=FetchType.LAZY),直到/除非我对集合执行操作,我的列表才会被查找。

我的主要问题是:如果我以这种方式查找一个人,然后将该人对象与一个长期存在的 HTTP 会话(例如 session.setAttribute("user", person))相关联,究竟会存储什么?如果我尝试通过会话关联对象访问用户图表中的一个人,Hibernate 会因为 Hibernate 会话已过期而出错吗?

这可能的根源是我真的不明白 Hibernate 会话何时在 Spring MVC 中开始和结束,所以如果有人想帮助解释这一点,那将非常棒(在服务级别使用 @Transactional 和 getHibernateTemplate在 DAO 级别)

谢谢。

【问题讨论】:

    标签: java spring hibernate


    【解决方案1】:

    通常,Hibernate 会话在请求中开始和结束。

    如果您在会话中存储Person 对象,则仅存储该对象,Hibernate 会话将结束。

    即使这样,将 Hibernate 会话绑定到会话的想法也是一个非常糟糕的主意,因为:

    • 会话下面是 JDBC 连接,因此您需要为每个 HTTP 会话(每个用户)保持一个单独的 JDBC 连接打开,这会很快达到资源限制。

    我认为使用Open Session in View 模式和OpenSessionInViewInterceptor 会更好。这样,您的关联将在您需要时延迟加载,但您不会保持大量连接处于打开状态。

    【讨论】:

    • 谢谢。我正在使用 OpenSessionInViewInterceptor,它工作正常。我只是想找出将用户信息与长期 http 会话相关联的最佳方式,这种方式与 Spring 和 Hibernate 配合得很好。
    猜你喜欢
    • 1970-01-01
    • 2014-08-05
    • 1970-01-01
    • 2012-04-07
    • 1970-01-01
    • 2011-06-28
    • 2011-05-03
    • 1970-01-01
    • 2010-10-18
    相关资源
    最近更新 更多