【发布时间】:2015-02-13 09:49:25
【问题描述】:
我目前正在开发一个客户端 (java/swing) 服务器 (tomcat/hibernate/jax-ws) 应用程序,该应用程序需要许多数据库操作,并且应该能够在服务器端执行长时间运行的后台任务。我选择这种设置主要是为了更好地重用代码。
但是,可能还有许多其他人也面临过并找到解决方案的一些问题:
最大的问题之一是延迟加载与 jax-ws。有一些可行的解决方案,比如覆盖 jax-ws 访问器 (JAX-WS + Hibernate + JAXB: How to avoid LazyInitializationException during marshalling) 解决了这个问题,将休眠的代理替换为 null。
现在我面临这个例子描述的新问题:
实体“客户”位于“国家”内,因此:n:1 关系。
“客户”中的“国家/地区”被标记为延迟加载,以避免不必要的数据库流量。当客户端 UI 想要列出客户(此处不需要国家/地区)时,在 jax-ws 访问器中将 country-proxy 替换为 null ,一切都很好。 但是,在编辑客户时,(我认为)我必须加入该国家/地区,即使不查看/更改它也是如此。否则,它的代理将在通过 jax-ws 发送到客户端时被 null 替换,然后发送回服务器,并提交(带有 null)到数据库中。此后我的客户->国家关联丢失了。
也许有几种解决方案,例如:
- 将国家标记为“optional=false”,当我忘记预先加入国家然后尝试保存客户时触发异常。使用这种方法,我必须始终加入所有参考文献,即使它们不是编辑过程的一部分。需要“optional=true”的引用会静默传递,编码错误可能会破坏数据库。
- 不是在 jax-ws 访问器中用 null 替换代理,而是其他一些虚拟类,当从客户端发送回服务器时,它会被原始代理替换。但我不确定这是否可行。
- 在客户端使用休眠并直接连接到数据库,仅使用 jax-ws 进行非数据库交互
- 通过发送相应的 jax-ws 请求编写一些代码以允许在客户端内进行延迟加载(必要时)(无法再找到 StackOverflow 链接,因为有人要求这样的东西)。完全感觉像是在重新发明 hibernate...
对于此类应用程序还有其他解决方案、建议、最佳实践、更好的设置吗?
提前谢谢!
【问题讨论】:
标签: java web-services hibernate tomcat jaxb