【问题标题】:Do Domain Classes usually get JPA or JAXB Annotations or both?域类通常会获得 JPA 或 JAXB 注释,还是两者兼而有之?
【发布时间】:2009-11-30 15:20:17
【问题描述】:

我有一个 Java 企业应用程序,它提供 Web 服务、域层和休眠持久层。在这种特殊情况下,我通过网络发送的对象、域对象和持久性对象之间(目前)并没有太大的区别。

目前,应用程序在持久性方面使用 DTO,并使用 JAXB 注释对域类进行注释。但是,我阅读和思考的越多,这似乎就越倒退! (更不用说有很多代码来支持 DTO 和域对象之间的无意识来回。)似乎大多数架构师建议将 JPA 注释放在域模型上并创建 DTO 以通过网络发送对象。

在我的情况下,我可以将 JAXB 和 JPA (Hibernate) 注释都放在我的域类上吗?

将我的 Web 服务外观、我的域和我的持久性紧密捆绑在一起的想法似乎很容易维护,但我确实担心,因为这些可能需要及时更改。但是,为 Web 服务端创建一组 DTO 类并为持久性端跳过 DTO 会更聪明吗?

【问题讨论】:

    标签: jpa annotations dns jaxb


    【解决方案1】:

    不使用 JPA 和 JAXB 注释对同一个类进行注释没有功能上的原因,我有时自己也这样做过。但是,它确实变得有点难以阅读,而且有时您希望在 JAXB 和 JPA 之间进行不同的类设计权衡。根据我的经验,这些权衡通常意味着您最终会得到两个类模型。

    【讨论】:

    • 有道理,迟早您需要将它们分成几层。但是在一个全新的项目中,将它们组合在一起可以节省大量时间。很高兴知道这样做没有不良的副作用。
    • 两年后我再次将它们分开,因为我们的客户端 webapp 只想使用它需要的数据,因此我们正在制作与我们的域分开的 DTO(带有 JAX-B 注释) (JPA) 实体。
    【解决方案2】:

    我同意使用相同的模型类是正确的方法。如果您担心注释混乱,可以使用 JAXB 实现(例如 EclipseLink JAXB),它提供了一种外部化元数据的机制:

    此外,由于您使用的是 JPA 模型 EclipseLink JAXB (MOXy) 具有使这更容易的扩展:

    下面是一个使用带有 JAXB 和 JPA 的模型来创建 RESTful 服务的示例:

    【讨论】:

      【解决方案3】:

      在同一个类上使用两个注解没有问题。我什至倾向于鼓励这样做,因为这样您就不必在发生更改时复制粘贴。 在某些情况下,某些属性的行为会有所不同 - 例如,可能不需要编组自动生成的 ID。然后合并@XmlTransient@Transient。它确实变得有点难以阅读,但不是太难,因为所有注释的含义都很明显。

      【讨论】:

        【解决方案4】:

        是否有人因为您已承诺在其中定义 Web 服务 xml 结构而试图将 atom 链接对象放入您的持久域中?这样做对我来说似乎很奇怪。 Hateoas 链接似乎是个好主意,但持久域和服务 impl(不是 Web 服务)对原子链接没有兴趣。再说一次,使用 xml 注释并让 jersey 为我序列化我的域当然很方便。这种方法的另一个缺点是,通过持久域“层”重构很容易在运行时影响您的 Web 服务消费者。

        【讨论】:

        • 我同意 Atom 链接(及其 JAX-B 注释)不属于域模块。但是,将 JAX-B 注释放在您确实拥有的域类上仍然是有意义的。也就是说,我还通过 MOXy 使用 XML JAX-B 映射文件,我觉得这非常方便,而且可以为不同的端点提供不同的映射。
        【解决方案5】:

        我知道这个问题有点老了,但我想我还是会权衡一下,因为这是我最近遇到的一个问题。我的建议是不理会带有 JAXB 注释的类,因为任何模式更改都需要重新生成这些类。这意味着您将不得不手动重新输入任何休眠注释等。这可能是一个有点过时的解决方案,但我认为创建一个休眠映射文件 (.hbm.xml) 以在外部容纳映射是完全合理的。在我看来,这更灵活、更简洁,而且同样有用。

        【讨论】:

        • “这意味着您必须手动重新输入任何休眠注释等。” - 参见 Hyperjaxb3,该插件自动创建 JPA 注释。 confluence.highsource.org/display/HJ3/Home免责声明:我是作者。
        • 我的想法,一年后:一个类与 JPA 和 JAXB 注释完美匹配的可能性非常小。我建议 99% 的时间将它们分成单独的文件。
        猜你喜欢
        • 2011-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-22
        • 2014-07-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多