【问题标题】:hibernate & JAXB/JSON (Message Model & Data Model)hibernate & JAXB/JSON (消息模型 & 数据模型)
【发布时间】:2023-03-06 21:19:01
【问题描述】:

这是一个关于如何将消息交换与数据模型紧密绑定的设计哲学问题。

给定一个实体 pojo,我可以使用 Hibernate、JAXB 和 JSON 注释对其进行注释,以便可以将相同的类写入数据库以及序列化/反序列化以进行消息交换。这方面的便利因素非常高,因为这意味着我不必编写翻译类来将消息转换为用于数据库的类(这对乏味和维护来说很重要)。

但是,这一直困扰着我,因为它完全将您的界面和消息与数据模型的结构和设计联系在一起。对于某些类型的应用程序,消息可能正是您想要存储在数据库中的内容,而有时它是数据库字段的子集。

有没有更好的方法来解耦这些而不会让自己陷入繁琐的翻译/转换课程?有没有一种模式可以用来至少更好地耦合消息和数据?

【问题讨论】:

    标签: java json hibernate jaxb


    【解决方案1】:

    我完全同意您的担忧...这是一个灰色区域,因为它实际上取决于您要解决的域问题。

    如果您的项目简单明了,那么我可能只需对实体进行注释即可完成。这样,消费者(例如:Javascript 代码)基本上会挑选出需要在页面上显示的数据。在这种情况下,您负责读取 JSON/XML 并做任何您想做的事情。

    但是,如果您正在编写向其他人公开的 Web 服务,则数据通常来自不同的实体(表连接)。在这种情况下,返回与实际实体结构如此紧密耦合的复杂 JSON/XML 是没有意义的。如果有一天你决定重构你的实体,那么你所有的消费者都会受到负面影响。因此,最好创建单独的 bean 来反映为消费者准备的汇总数据,而不是依赖现有的实体 bean。这样,生成的 JSON/XML 将能够承受未来的变化,并将负面连锁反应降至最低。

    【讨论】:

    • 像往常一样,没有灵丹妙药=) 我唯一能想到的就是从一个通用实体开始,并且永远不要害怕重构它以将其分离出来。说起来容易做起来难,我知道。我只是希望有一个好的模式或约定是一个更好的起点。
    • :) 我在项目中处理它的方式是,如果 XML/JSON 被我的应用程序 AJAX 调用使用,我倾向于重用实体。但是,当我为其他开发人员编写 Web 服务时,我总是先设计我希望 XML/JSON 的外观,然后再将元素/属性名称映射到单独的 bean。例如,我更喜欢 audio-path 元素名称,而不是 'audioPath' 驼峰式。
    【解决方案2】:

    您可以利用 EclipseLink JAXB (MOXy) 中的 @XmlPath 扩展来打破实体模型和消息格式之间的关系(我是 MOXy 技术负责人):

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-15
      • 2010-10-20
      • 1970-01-01
      • 2020-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      相关资源
      最近更新 更多