嘿,我正在构建一个四层软件系统(演示 - JSP、问题域、应用程序逻辑、持久性),并且我希望每个请求都让我的事务处于休眠状态,这样我就不会每次都进行事务做某事然后...
我对您如何使用 ClickServlet 来维护每个请求的一个事务时如何使您的应用程序具有 4 个抽象层感兴趣。 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 模型传递到上面的层。为了提高效率,您必须在这些层中实现分页(否则您通常会将所有数据加载到内存中,这很糟糕)。
这种方式,再加上我认为当前的最佳实践是事务的切面。