Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 客户机-服务器通信和持久性框架_Hibernate_Design Patterns_Jpa_Jakarta Ee - Fatal编程技术网

Hibernate 客户机-服务器通信和持久性框架

Hibernate 客户机-服务器通信和持久性框架,hibernate,design-patterns,jpa,jakarta-ee,Hibernate,Design Patterns,Jpa,Jakarta Ee,在服务器端使用Hibernate、JPA等持久性框架时,在客户端和服务器之间传递数据的一般做法是什么?是否有任何现有的相同设计模式 谢谢。客户机-服务器,或者包含数据库,三层体系结构本身就是一种设计模式。问题是应该在通信中使用哪种技术。有很多选择,例如HTTP、TCP、UDP、JMS、XMLRPC、RMI、CORBA、C-RPC或邮鸽携带的闪存驱动器。一般来说,建议 使用一种具有工具的技术来定义您的消息/数据格式,比如通过JMS/HTTP/定义SOAP(WSDL)、CORBA(IDL)、XML

在服务器端使用Hibernate、JPA等持久性框架时,在客户端和服务器之间传递数据的一般做法是什么?是否有任何现有的相同设计模式


谢谢。

客户机-服务器,或者包含数据库,三层体系结构本身就是一种设计模式。问题是应该在通信中使用哪种技术。有很多选择,例如HTTP、TCP、UDP、JMS、XMLRPC、RMI、CORBA、C-RPC或邮鸽携带的闪存驱动器。一般来说,建议

  • 使用一种具有工具的技术来定义您的消息/数据格式,比如通过JMS/HTTP/定义SOAP(WSDL)、CORBA(IDL)、XML(XSD、RELAXNG、Schematron等等)
  • 当性能不是主要问题时,选择基于文本的格式(XML、JSON等),而不是二进制(RMI、CORBA等)。对于编写下一版本或全新客户端的程序员来说,文本格式更容易理解。调试或审核这样的接口也更容易
  • 使用开放的标准技术,不要重新发明轮子
  • 选择适合您的通信模型的底层传输。例如,JMS非常适合于fire-and-forget通信,而HTTP非常适合于同步请求-应答
  • 请记住更高级别的体系结构。例如,如果您的服务器(服务)是由同一IT部门维护的众多服务器之一,建议对所有服务器(服务)使用相同的通信技术(另请参见SOA)

关于您对所选持久性框架的依赖性问题,我认为没有。您选择使用例如Hibernate并不强制或排除任何客户机-服务器通信技术。

我不知道模式,但我知道在一个使用例如EJB3和JPA的设计中,不建议通过远程EJB将JPA实体传递给客户机,因为代理保留下来,它会生成许多无用的网络交通。您最好分离实体或给客户端简单的值对象。

理想情况下,持久层应该与客户端-服务器通信层完全分离。虽然不是严格意义上的模式,但这里的想法是

正如HerQuLe所说,您应该尝试确保在客户端和服务器之间发送的数据只是POJO样式的信息,而不是序列化(可能要复杂得多)代理。

因为您可能使用DTO模式,即将实体复制到POJO。但您可以向客户端发送JPA实体以避免DTO。发送实体存在两个问题:

  • 惰性关系:在发送实体之前,必须初始化所有必要的惰性关系。(远程客户端如何读取惰性关系,有几种解决方案,我不建议这样做)
  • 实体可能包含JPA/Hibernate特定的代码-注释、集合、代理。你要么
    • 将Hibernate/JPA JAR添加到客户机代码中
    • 在发送实体之前,请先清理它们。(您不需要清理注释,只需将hibernate-annotations.jar添加到客户机代码中即可)。看

  • 您好,关于创建值对象有什么标准模式/实践吗?我想您应该阅读:解释一切:)使用DTO模式:)在JEE6中,您可以使用实体管理器分离单个实体,这样您就可以将分离的实体提供给客户端,而无需序列化我猜的所有内容。。。在此之前,您必须同时分离所有实体…:(