0

嘿,我正在构建一个四层软件系统(演示 - JSP、问题域、应用程序逻辑、持久性),我希望每个请求都让我的事务处于休眠状态,这样我就不会在每次我想做某事时都进行事务而且我可以对我的对象进行数据跟踪,以便只更新已更改的属性。

我已经将 spring 视为一个框架,尽管我很想实现它,但我的团队已经否决了它,我们不能使用它。

我还查看了 JTA,但由于我没有使用 bean,所以我看不出它会有什么用处。

我已经考虑过一种解决方案,例如有一种方法来调用关闭和打开事务,但似乎可能有一个更优雅的解决方案。

根据我的系统,按请求保留交易的最佳方式是什么?

4

2 回答 2

0

Apache为Hibernate提供了一个SessionFilter ,点击后说明。

于 2011-02-27T01:22:18.193 回答
0

嘿,我正在构建一个四层软件系统(演示 - JSP、问题域、应用程序逻辑、持久性),我希望每个请求都让我的事务处于休眠状态,这样我就不会在每次我想做某事时都进行事务和 ...

我对您如何使用 4 个抽象层制作应用程序感兴趣,而您使用 ClickServlet 来维护每个请求的一个事务。AFAIK 您的事务将与您的活动 servlet 工作线程一样多的请求。

如果您想利用 Hibernate 的延迟加载功能,您可以:

(1) 必须在请求仍处于活动状态时维护事务(这样您就不会得到 LazyLoadingException),或者

(2) 你必须隔离层,让层通过 DTO 和 VO 而不是将 Hibernate 模型传递到上面的层。

IMO 后者是一种更简洁的方法,因为拥有抽象层的主要目标是使它们更易于重用、更易于测试和分离关注点。

我建议您不要在 Servlet 会话/请求级别处理事务。它将使您在演示文稿下的所有层都与 Servlet API 紧密耦合。通常,当我们想要拥有抽象层时,这不是我们想要的。因此,Apache Click 框架及其 ClickServlet 可能不是最好的方法。Spring 可以更好地处理这个问题。如果你被否决了,那就太糟糕了。

如果您不想使用 Spring 自动事务,您仍然可以使用 AspectJ(或其他面向方面的编程组件)透明地处理您的事务(进入方法时创建事务,退出方法时提交/回滚)。当然,这比简单地采用 Spring 框架更麻烦。

...而且我可以对我的对象进行数据跟踪,以便只更新已更改的属性。

这可以通过 Hibernate Level 1 Cache + Lazy Loading 透明地处理。你不必自己做。Hibernate 只会在会话被刷新、L1 缓存已满或事务提交时向后端生成 SQL。通常,您不必做任何事情来最小化后端的数据操作语言 (DML) 语句,通常 Hibernate 在正确配置时可以更好地处理这个问题。

我还查看了 JTA,但由于我没有使用 bean,所以我看不出它会有什么用处。

您可以在没有 bean 的情况下使用 JPA。它只是一个您可以从任何地方调用的 API。

我已经考虑过一种解决方案,例如有一种方法来调用关闭和打开事务,但似乎可能有一个更优雅的解决方案。

是的。查看 Gregor Kiczales 的面向方面编程。Spring Framework 支持这个现成的 AOP。如果您的团队否决了它,您仍然可以自己动手。

根据我的系统,按请求保留交易的最佳方式是什么?

最佳方法(假设您计划有 4 个抽象层)是将数据从 Hibernate 域模型加载到持久层的数据传输对象/值对象。上面的层,Application Logic Layer 可以访问 Hibernate 域模型,但不能将 Hibernate 模型传递到上面的层。为了提高效率,您必须在这些层中实现分页(否则您通常会将所有数据加载到内存中,这很糟糕)。

这种方式,再加上我认为的事务方面是当前的最佳实践。

于 2011-02-28T09:02:15.767 回答