【问题标题】:How to simplify Spring/Hibernate combo without going to Roo如何在不使用 Roo 的情况下简化 Spring/Hibernate 组合
【发布时间】:2011-11-10 22:08:26
【问题描述】:

在过去的一年里,简化这个组合有什么新的进展,还是和以前基本一样?

我不太喜欢很多新的 RAD 框架/平台(Rails 等)。我认为它们非常适合小型应用程序或概念证明……但是当我处理复杂的需求时,我通常很快就会对它们的缺点感到恼火。尤其是 Rails 有很多问题 - 与我在 Java 中花费的时间相比,实际上让我慢下来的问题太多了……我认为大多数人永远不会遇到的事情……或者可能永远不会遇到,直到他们的蜜月期结束了。

在许多情况下,我宁愿拥有 Spring/Java 的强大功能和可靠性,即使这意味着我需要更长的时间来开发应用程序。我对此感到很自在。我相信它。我知道如何部署它。它有效,并且适用于大型应用程序。

我真的很想尽可能地改善我的开发体验。我正在寻找人们现在通常喜欢在他们的 Spring/Hibernate 项目(或者我猜是 Spring/Whatever 工作......)中用于大型 web 2.0 (ria) 类型的项目。

  1. 我非常确信 dbunit 已经过时,并且是我的测试性能问题的主要来源。有没有类似于工厂女孩的东西,但对于java?

  2. 有没有办法让链接更像“应用程序”,而不仅仅是松散的字符串?我倾向于大量重构 url,并且手动测试应用程序以确保没有中断是一种很大的痛苦。我很感激对此的任何解决方案。我目前使用 Freemarker/Spring MVC。

  3. 我发现我需要在我的应用程序中使用越来越多的 AJAX。简单的 ajax 很好,但目前我必须使用 Jackson 来解析传入的请求 JSON,然后才能进入 Spring MVC 控制器。很多这种解析/映射非常耗时。一定有更好的方法。有没有?我不想再为传入我的控制器层的 JSON 请求编写解析器/对象映射器了。

  4. Rails 中我真正喜欢的一件事是能够将查询拼凑在一起并拥有可重用的查询片段。我忘了他们叫什么。有没有办法使用 Hibernate/Spring 来做到这一点?我有很多使用大量 HQL 字符串的查询,而且很多时候,这些查询的片段只是在整个应用程序中一遍又一遍地重复。我想在这里重用我能做的。能做到吗?

  5. 我在部署时通常会遇到太多小问题,而这些小问题在测试时永远不会被发现。 Hibernate 代理错误和奇怪的延迟加载问题在此列表的顶部,但即使是 Spring MVC 控制器的注释问题和各种其他问题也可能出现难以测试(或者可能无法测试?)。这些问题有哪些解决方案?不使用休眠?做其他类型的测试吗?什么有效?我不介意做测试,但我希望它快一点,否则我可能会生气并拒绝做。

  6. 一般来说,您认为有助于提高生产力的任何其他事情,我可能没有听说过。不幸的是,我有一段时间没有在 Java 领域太活跃了,所以我落后了。我需要一点“这是现在可用的”类型的建议。

谢谢!

【问题讨论】:

  • 与 Jackson 的对象映射不是单线(在创建数据模型之后)吗?
  • @Kevin:不,因为传入的 json 可能引用对象 ID,您需要将其从数据库中提取出来(即映射)。这需要您为传入的 json 请求定义自定义解析器/映射器。我承认,对于简单的东西,默认设置(大部分)有效,但对于复杂的东西,你需要做很多工作。

标签: java ajax spring web-applications


【解决方案1】:

我只会回答我知道的那些......

2. 我们已经在我们的应用程序中使用自定义标记库完成了类似的操作,但这显然只有在您使用 JSTL 时才有用。您是否考虑过创建一个包含所有 URL 作为静态最终字符串的类,然后将该类作为 shared variable 添加到 Freemarker?然后,您在 Spring MVC 中的 @RequestMapping 注释应该能够引用那些相同的静态最终字符串。

3. 我推荐Direct Web Remoting — 它会自动为您处理服务器和客户端站点上的 AJAX 调用。设置完成后,只需注释要从 Javascript 代码调用的 Java 方法,然后 DWR 生成 Javascript 代码,为您进行这些调用并将返回值转换为 Javascript 对象。 DWR 有一段时间没有积极开发了,但我发现它非常稳定可靠。

5. 特别是关于 Hibernate 延迟加载,我们只启用 Spring 的 org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor,它为整个 Web 请求保持单个会话打开。它消除了延迟加载错误,并使 Hibernate 的行为更易于理解(即,因为您始终处于会话中,所有更新都提交给数据库)。如果您打算这样做,请在开发开始时进行...否则现有代码可能会被破坏,因为如果它假定会话已关闭。

6.如果您的网站更多的是网络应用程序而不是网站,请考虑使用Vaadin 构建它。它是基于 GWT 构建的开源 RIA 框架,我们非常成功地将它与 Spring 和 Hibernate 一起使用。我们将 Vaadin 用于管理工具等“类应用程序”部分,将 Spring MVC / JSTL 用于“类 web”部分(如面向公众的页面);两者都内置在具有相同 Spring / Hibernate 业务层的相同 WAR 中。

【讨论】:

  • 感谢您的回复。我实际上正在使用 OpenSessionInViewInterceptor,但它并不总是有效。例如,会话中的任何对象引用都将丢失,例如与当前用户关联的对象。您可以调用它们的指针是相当具有欺骗性的,但它们会下降,因为休眠会话在多次页面请求后早已消失。我将研究 DWR/Vaadin。我总是对“在上面”添加新的大型工具/框架持谨慎态度。我将看看增加的复杂性是否可以通过易于开发来弥补。有时情况并非如此,所以我得看看。
  • 我经常遇到的最烦人的事情是休眠。有时many-to-one 关系被设置为惰性,它确实需要惰性......但是,拉出父对象然后先发制人地初始化惰性实例仍然会加载一个愚蠢的 java-assist 对象。这个对象在 Spring MVC 中通常不起作用。例如,即使规则设置正确,验证也不起作用。此外,IDEA 生成的 equals/hashcode 对 Hibernate 有有趣的行为。我敢肯定它为什么不起作用有一个合理的解释,但我宁愿不必担心这个废话
  • 我假设“会话中的对象引用”是指将数据对象存储在应用程序服务器 HttpSession 而不是 Hibernate 会话中。我认为这是一个糟糕的主意,有几个原因:(1)您不再有关于记录的单一事实来源...... HttpSession 中的那个正确还是 Hibernate 中的那个正确? (2) 应用程序服务器必须将会话数据保存在内存中,这通常会严重限制您可以拥有的活动用户数量 (3) 如上所述,您会遇到延迟加载异常。 — 我建议在 HttpSession 中只存储 ID,将所有数据保存在 Hibernate 中。
  • 是的,我现在只存储 id。尽管如此,Spring、Spring Security 等的默认设置是这个问题存在的真正原因。它没有正确设置,因此成千上万的人遇到了我遇到的问题。我不再有这个问题,但正是这种经历让我对事物产生了错误的印象。尽管如此,代理问题仍然存在,除了创建 DTO 之外,我不知道如何处理这个问题,这又是更加臃肿。我们需要简化东西,而不是添加。如果你问我,所有这些问题都只是臃肿。没有必要,也不应该。
猜你喜欢
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 2023-03-16
  • 2019-10-22
  • 2014-02-06
  • 1970-01-01
  • 2018-02-04
  • 2016-01-23
相关资源
最近更新 更多