gpt4 book ai didi

java - Tomcat、JAX-WS、Hibernate——缺陷和解决方案?

转载 作者:行者123 更新时间:2023-11-28 23:32:27 26 4
gpt4 key购买 nike

我目前正在开发一个客户端(java/swing)服务器(tomcat/hibernate/jax-ws)应用程序,它需要很多数据库操作并且应该能够在服务器端执行长时间运行的后台任务。我选择此设置主要是为了更好地重用代码。

但是,有些问题可能许多其他人也面临并找到了解决方案:

最大的问题之一是延迟加载与 jax-ws。有一些可行的解决方案,例如覆盖 jax-ws 访问器 ( JAX-WS + Hibernate + JAXB: How to avoid LazyInitializationException during marshalling ) 解决了这个问题,将 hibernate 代理替换为 null。

现在我面临着这个例子描述的新问题:

实体“客户”位于“国家/地区”内,因此:n:1 关系。

“客户”中的“国家”被标记为延迟加载以避免不必要的数据库流量。当客户端 UI 想要列出客户时(此处不需要国家/地区),在 jax-ws 访问器中将 country-proxy 替换为 null,一切正常。但是,在编辑客户时,(我认为)我必须加入该国家/地区,即使不查看/更改它也是如此。否则,当通过 jax-ws 发送到客户端时,它的代理将被 null 替换,然后发送回服务器,并提交(使用 null)到数据库中。此后,我的客户->国家/地区关联丢失了。

也许有几种解决方案,例如:

  • 将国家标记为“optional=false”会在我忘记事先加入该国家然后尝试保存客户时触发异常。使用这种方法,我必须始终加入所有引用,即使它们不在编辑过程中也是如此。需要“optional=true”的引用会悄无声息地传递,编码错误可能会破坏数据库。
  • 不是在 jax-ws 访问器中用 null 替换代理,而是一些其他虚拟类,当从客户端发送回服务器时,由原始代理替换。但我不确定这是否可行。
  • 在客户端使用hibernate并直接连接数据库,仅使用jax-ws进行非数据库交互
  • 通过发送相应的 jax-ws 请求编写一些代码以允许在客户端内进行延迟加载(必要时)(再也找不到 StackOverflow 链接,有人要求这样的东西)。完全感觉就像重新发明 hibernate ...

对于此类应用程序是否有任何其他解决方案、建议、最佳实践和更好的设置?

提前致谢!

最佳答案

与传输数据的方式相比,您存储数据的方式显然不同。因此,不使用相同的对象实例进行传输和存储可能是有意义的。

解决方案之一是为此使用不同的类 - DTO 和实体。您存储实体但传输 DTO。这需要额外的努力来实现 DTO 和映射 DTO<-> 实体,但这可以让您清楚地分离层,并且从长远来看可能会更有效率(从努力的角度来看)。您可以使用 Dozer 等在 DTO 和实体之间进行映射。

另一种方法是不使用不同的类,而是使用不同的对象实例进行传输和存储。这可能类似于@VinZ 的回答。您将源对象中的数据“合并”到目标对象中。我写了一个JAXB plugin前一段时间生成这样的合并方法,发现该方法在不同的用例中非常有用。
与 DTO 相比,使用这种方法可以节省大量工作,但不会在类级别进行层分离。

我个人会选择经过完善和完善的实体结构以及针对传输进行优化的额外 DTO。我也会尝试以某种方式自动生成合并/复制方法以避免手动编写的需要。也许是一个 JAXB 插件。我喜欢编写 JAXB 插件,所以如果可以使用 JAXB 插件解决某些问题,我会使用 JAXB 插件来解决。

希望这对您有所帮助。

关于java - Tomcat、JAX-WS、Hibernate——缺陷和解决方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28496688/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com