【问题标题】:Read only data via Spring + Hibernate通过 Spring + Hibernate 只读数据
【发布时间】:2012-03-13 21:26:23
【问题描述】:

注意到如果我想读取一些数据并且如果我没有事务上下文,我将无法这样做,因为

org.hibernate.HibernateException: No Session found for current thread

读取数据,一般不需要事务。

因此,为了让 Spring 管理会话,即使对于像选择这样的只读操作,它也需要有一个事务...?

这不是开销吗?

PS.我不想手动打开和关闭会话...

非常感谢。

【问题讨论】:

    标签: java spring hibernate transactions


    【解决方案1】:

    @Transactional 告诉 spring 打开和关闭会话,除了指示它启动和提交事务。这不是很简单,但这就是它的工作原理。因此,如果您没有@Transactional,则不会打开任何会话。以下是您的选择:

    • 使用@Transactional(readOnly=true) - 目的是进行只读事务。我推荐一个
    • 使用 JPA EntityManager 注入 @PersistenceContext。它将为每次调用打开一个新的基础会话。不是那么好的选择。但是您应该考虑将EntityManager 与 readOnly=true 事务一起使用
    • 使用其他方面/拦截器/过滤器来打开和关闭会话。这会很困难,而且您最终可能会对 hibernate 当前会话概念的 spring 实现感到困惑。

    【讨论】:

    • 我使用 Spring + Hibernate(没有 JPA)。现在为了读取一些数据并为了让 Spring 管理会话,我需要使用 @@Transactional。我可以选择打开和关闭手动会话,但我认为不优雅?!但我有这件事,即使使用只读也使用@@Transactional。它与不使用只读相同,并且存在一些潜在的开销..
    • readonly 仅在您想阻止写入数据时才有效。据我所知..ibm.com/developerworks/java/library/j-ts1/index.html
    • 不用担心开销,即使有。
    猜你喜欢
    • 2021-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    • 2011-07-09
    相关资源
    最近更新 更多