【问题标题】:OpenEntityManagerInView equivalent for Junit and Quartz JobsJunit 和 Quartz 作业的 OpenEntityManagerInView 等效项
【发布时间】:2011-08-10 20:29:55
【问题描述】:

是否有任何标准方法(或替代Open Session [EntityManager] in View)来使用依赖于实体的延迟初始化(fetch = FetchType.LAZY) 的类 以下两个用例:

  1. 在 JUnit 测试用例中

  2. 在石英工作中

对于上述两种情况,OSIV 模式都将不起作用,因为没有 Web 请求进入系统。在这种情况下如何让延迟加载工作?

PS:Spring 的OpenEntityManagerInViewFilterOpenEntityManagerInViewInterceptor 都是面向Web 请求的。

  1. 我无法通过模拟 get 来预取所有此类关系/实体,只是为了在存储库 (DAO) 中关闭会话之前加载它。
  2. 我知道,对于 JUnit,我可以在 @Before / @after 中手动打开/关闭 EM。但我正在寻找更优雅和标准的东西。

参考: LazyInitializationException due to no session defined in "parent" application context in Hibernate 3 in a moduled Spring application using annotations

【问题讨论】:

    标签: spring jpa quartz-scheduler junit4


    【解决方案1】:

    事务是您所需要的。打开一个事务,获取数据,操作它,然后在完成后关闭事务。 Spring 将 EntityManager 生命周期绑定到事务的生命周期,并在您需要时保持打开状态。

    Spring 事务管理本身就是一个重要的主题,但使用它确实非常简单。请参阅docs

    【讨论】:

    • 这正是我发布问题的原因,为了避免在每个作业/测试用例中手动打开/关闭某些东西(EM/TX)(不想将它推到基类并做extends 的东西)。只是想知道是否有更好的方法。
    • @kunal:Spring 提供事务性单元测试支持 - 请参阅 static.springsource.org/spring/docs/3.0.x/…
    • 好吧,我正在尝试@Transactional。它在 Job 中对我有用,但到目前为止在 JUnit 中没有运气。将尝试更多并很快更新。谢谢。
    • 是的,它适用于 JUnit。 Spring-JPA -> Spring-Dao 的传递依赖存在一些问题。排除两者并且它有效。参考:norrisshelton.wordpress.com/2011/01/31/spring-dao-2-x-problems
    猜你喜欢
    • 2012-01-22
    • 1970-01-01
    • 2011-11-12
    • 1970-01-01
    • 2015-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多