嘿 我正在构建一个四层软件系统(演示 - JSP,问题域,应用程序逻辑,持久性),我想让我的事务处理每个请求的休眠状态,这样我每次想做某事时都不会进行交易。我可以使用我的对象进行数据跟踪,以便只更新已更改的属性。
我把spring看作是这个的框架,尽管我很乐意实现这一点,但是我的团队已经否决了它,我们无法使用它。
我也看过JTA,我看不出它会如何使用,因为我没有使用bean。
我已经考虑过一个解决方案,例如调用关闭和打开事务的方法,但似乎可以有更优雅的解决方案。
根据我的系统保留每个请求的最佳交易方式是什么?
答案 0 :(得分:0)
Apache在点击后为Hibernate提供SessionFilter指令。
答案 1 :(得分:0)
嘿,我正在构建一个四层软件系统(Presentation - JSP,Problem Domain,Application Logic,Persistence),我希望每次请求都能在休眠状态下进行交易,这样我每次都不会进行交易做某事......
我感兴趣的是如何使用ClickServlet为每个请求维护一个事务,如何使用4抽象层创建应用程序。 AFAIK您的事务将与您的活动servlet工作线程一样多的请求。
如果你想利用Hibernate的延迟加载功能,你可以:
(1)当请求仍处于活动状态时必须维护事务(这样你就不会得到LazyLoadingException),或者
(2)你必须隔离图层,让图层传递DTO和VO,而不是将Hibernate模型传递给上面的图层。
IMO后者是一种更清洁的方法,因为拥有抽象层的主要目的是使它们更容易重用,更容易测试,并将问题分开。
我建议你不要在Servlet会话/请求级别处理事务。它将使下面的所有图层与Servlet API紧密结合。通常,当我们想要拥有抽象层时,这不是我们想要的。因此,Apache Click框架及其ClickServlet可能不是最好的方法。 Spring可以更好地处理它。如果你被否决了,那就太糟糕了。
如果您不想使用Spring自动事务,您仍然可以使用AspectJ(或其他面向方面的编程组件)透明地处理事务(在输入方法时创建事务,在退出方法时提交/回滚)。当然,这比仅采用Spring Framework更加毛茸茸。
...我还可以使用我的对象进行数据跟踪,以便只更新已更改的属性。
这个可以透明地通过Hibernate Level 1 Cache + Lazy Loading来处理。你不必自己动手。 Hibernate只会在刷新会话或L1缓存已满或者在事务提交时为后端生成SQL。 通常,您不必为了将数据操作语言(DML)语句最小化到后端而执行任何操作,通常Hibernate在正确配置时可以更好地处理此问题。
我也看过JTA,我看不出它会如何使用,因为我没有使用豆子。
您可以在没有bean的情况下使用JPA。它只是一个可以从任何地方调用的API。
我已经考虑过一个解决方案,例如调用关闭和打开事务的方法,但似乎可以有更优雅的解决方案。
是。看看Gregor Kiczales的面向方面编程。 Spring Framework支持这种现成的AOP。如果你的团队否决它,你仍然可以自己动手。
根据我的系统保留每个请求的最佳交易方式是什么?
最佳方法(假设您计划有4个抽象层),将数据从Hibernate域模型加载到持久层的数据传输对象/值对象。 在上面的层中,Application Logic Layer可以访问Hibernate域模型,但可能无法将Hibernate模型传递到上面的层中。为了提高效率,你必须在这些层中实现分页(否则你经常会将所有数据加载到内存中,这很糟糕)。
通过这种方式,再加上交易的方面,我认为这是当前的最佳实践。