在通过Hibernate支持的事务服务方法传递数据时,有没有真正实用的方法来避免使用DTO?换句话说,DTO是避免延迟初始化问题的唯一非hacky解决方案吗?
我认为DTO的两种流行替代品以及我不喜欢它们的原因是:
>在视图模式中打开会话.我不喜欢这样,因为我希望保持服务方法真正的事务性(即Hibernate会话在方法退出时提交并关闭).这主要是因为如果我需要稍后将服务发布为Web服务,我不必担心事务.
>通过服务方法而不是DTO传递域/业务对象,并渴望获取所需的属性/属性.这有点好些.然而,在具有复杂实体关系的非平凡域对象层次结构中,急切的提取必须在某处停止.当它发生时,我无法看到这将如何不会很快变成一个完整的hackaton替换具有引用ID的实体.
从可维护性的角度来看,我是否遗漏了某些东西或DTO实际上是唯一可靠的方法?
最佳答案 真正使用端到端实体的唯一方法是使用比OpenSessionInView更复杂的东西.根据我的经验,您将不得不在应用程序级别手动管理hibernate会话. OpenSessionInView只会为一个请求提供相同的会话.之后,您需要不断重新连接到当前会话.查看Seam和对话,或实现自己的Hibernate会话管理.我们目前根据向导启动和结束的时间手动管理会话,并使用
Spring AOP将会话及时连接到正确的线程(会话不是线程安全的,不是与AJAX的良好组合)
另一方面,Web服务肯定需要某种形式的DTO.我没有看到解决方法.实体可能看起来像POJO但不是真的,序列化可能从困难到几乎不可能.只需创建符合服务方法目标的DTO并完成它.
就个人而言,我认为DTO模式并不可怕,如果你只是建立一个网站,可以与实体端到端,甚至可能会给你带来一些性能,但如果你想要一个更灵活的架构,坚持下去DTO的.