【问题标题】:Hibernate session available for queries but lazyInit not working in flowHibernate 会话可用于查询,但lazyInit 无法正常工作
【发布时间】:2015-03-19 17:36:23
【问题描述】:

我正在使用 hibernate 4.3 和 SWF 2.4,在特定情况下遇到了一个奇怪的行为,导致 LazyInitializedException。

这是流程的配置:

<persistence-context />

<on-start>
    <!-- attach enterprise to session if not provided -->
    <evaluate expression="enterpriseInput ?: enterpriseDaoImpl.merge(externalContext.sessionMap.workingEnterprise)" result="flowScope.enterprise"/>
</on-start>

<view-state id="start" view="filiation/list">
    <transition to="showBoardOrGoToList" on="save" />
</view-state>

<action-state id="showBoardOrGoToList">
    <evaluate expression="flowController.displayBoard(event)"  />
    <transition on="yes" to="boardSubflow"/>
    <transition on="no" to="something" />
</action-state>

<subflow-state id="boardSubflow" subflow="board">
    <on-entry>
        <evaluate expression="boardFlowController.initAdmins(enterprise)" result="flowScope.admins" />
    </on-entry>
    <input name="admins" value="flowScope.admins"/>

    <output name="enterprise" value="flowScope.enterprise"/>

    <transition on="save" to="end">
        <evaluate expression="enterpriseDaoImpl.merge(enterprise)" result="flowScope.enterprise"/>
    </transition>
    <transition on="cancel" to="cancel"/>
</subflow-state>

...

当流量到达以下行时:

<evaluate expression="boardFlowController.initAdmins(enterprise)" result="flowScope.admins" />

它会触发一个 LazyInitializedException,方法 initAdmins() 基本上是对列表的元素执行 Hibernate.initialize()。

for (Administrator administrator : enterprise.getAdministrators()) {
    Hibernate.initialize(administrator);
}

如果在该行之前调用了 DAO 上的方法,它将毫无问题地执行 DB 查询,这意味着此时休眠会话可用,但lazyInit 不起作用。

但是,如果我在流程的 &lt;on-start&gt; 标记中调用 initAdmins(),它可以工作...

有效的流程配置:

<persistence-context />

<on-start>
    <!-- attach enterprise to session if not provided -->
    <evaluate expression="enterpriseInput ?: enterpriseDaoImpl.merge(externalContext.sessionMap.workingEnterprise)" result="flowScope.enterprise"/>
    <evaluate expression="boardFlowController.initAdmins(enterprise)" result="flowScope.admins" />
</on-start>

<view-state id="start" view="filiation/list">
    <transition to="showBoardOrGoToList" on="save" />
</view-state>

<action-state id="showBoardOrGoToList">
    <evaluate expression="flowController.displayBoard(event)"  />
    <transition on="yes" to="boardSubflow"/>
    <transition on="no" to="something" />
</action-state>

<subflow-state id="boardSubflow" subflow="board">

    <input name="admins" value="flowScope.admins"/>

    <output name="enterprise" value="flowScope.enterprise"/>

    <transition on="save" to="end">
        <evaluate expression="enterpriseDaoImpl.merge(enterprise)" result="flowScope.enterprise"/>
    </transition>
    <transition on="cancel" to="cancel"/>
</subflow-state>

...

问题是我只想在需要时初始化管理员,因为这是一项昂贵的操作。

关于持久性上下文机制的信息很少,所以我找不到对此的解释。

对我来说,它真的看起来像一个错误。

有人可以强调我或解释为什么lazyInit 在on-start 标记之外被破坏了吗? 谢谢

【问题讨论】:

  • 我遇到了类似的问题。我不得不将我的项目列表更改为 Set 并覆盖 equals/hashCode。

标签: java hibernate lazy-initialization spring-webflow-2


【解决方案1】:

不确定是什么导致了问题。我以前经历过这种情况,我同意我认为这也是一个错误,但是我认为不值得努力解决问题,因为我们必须进入 WebFlow 代码(这样做几次......不是乐趣需要几个小时),我总是找到一个简单且不打扰的工作(5分钟或更短)。

尝试在接下来的过渡中初始化管理员

<transition on="yes" to="boardSubflow"/> 

看看它现在是否有效。 (就您的效率目标而言,与子流程内的启动效果相同)。

<transition on="yes" to="boardSubflow">
        <evaluate expression="boardFlowController.initAdmins(enterprise)" result="flowScope.admins" />
</transition>

如果这不起作用,请尝试创建一个唯一目的是初始化管理员的操作状态。将此动作状态置于转换 -> 子流调用的中间。确保在此操作状态的启动或退出时评估表达式。

<action-state id="initAdminsActionState">
      <transition to="boardSubflow"/> 
      <on-exit>
          <evaluate expression="boardFlowController.initAdmins(enterprise)" result="flowScope.admins" />
      </on-exit>
</action-state>

【讨论】:

  • 我会将其添加到我的待办事项列表中以尝试追踪并报告此错误,但它对我来说优先级较低:)
  • 感谢您的回答,我已经尝试按照您的建议将其置于 on="yes" 转换中,但错误也会发生。事实上,我试图把这个初始化几乎无处不在,例如,它在“开始”视图状态的入口处起作用,但在第一个视图状态之外显然没有任何作用。我可以确定在流程开始时是否需要初始化,所以这不是一个真正的问题,但这确实是一个错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-10
  • 2018-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多