Java 为什么人们继续使用xml映射文件而不是注释?

Java 为什么人们继续使用xml映射文件而不是注释?,java,hibernate,orm,jpa,annotations,Java,Hibernate,Orm,Jpa,Annotations,我观察到一个奇怪的事实(基于hibernate标签中的问题),人们仍然在积极地使用xml文件而不是注释来指定他们的ORM(hibernate/JPA)映射 在一些情况下,这是必要的: 您正在使用提供的类,并且希望映射它们 您正在编写一个API,它的域类可以在没有JPA提供程序的情况下使用,因此您不想强制使用JPA/Hibernate依赖关系 但我认为这些情况并不常见 我的假设是: 人们已经习惯了xml文件,不愿意/不想费心学习使用注释方法 Java pre-1.5被强制用于该项目,对此没有

我观察到一个奇怪的事实(基于hibernate标签中的问题),人们仍然在积极地使用xml文件而不是注释来指定他们的ORM(hibernate/JPA)映射

在一些情况下,这是必要的:

  • 您正在使用提供的类,并且希望映射它们
  • 您正在编写一个API,它的域类可以在没有JPA提供程序的情况下使用,因此您不想强制使用JPA/Hibernate依赖关系
但我认为这些情况并不常见

我的假设是:

  • 人们已经习惯了xml文件,不愿意/不想费心学习使用注释方法
  • Java pre-1.5被强制用于该项目,对此没有什么可做的
  • 人们不知道注释是xml映射的全功能替代品
  • 支持遗留系统,因此更改方法被认为是有风险的
  • 人们担心将注释(元信息)与类混合是错误的

任何其他可能的解释?

在需要特定于环境或系统的配置时,使用XML补充注释。

我有一个新的解释:


非常好的屏幕播放系列还没有包括注释。我已经用它编写了一些应用程序来学习基础知识,不是为了工作,而是出于好奇,但从未迁移到注释。建议的系列仍然相关。如果我有更多的空闲时间,我仍然会迁移到注释,但目前我可能是其中一个对此提出问题的人。

一些人认为域层和持久性层是不同的关注点。使用纯XML方法使两层尽可能松散地耦合;由于域代码中嵌入了与持久性相关的代码,因此使用注释可以更紧密地耦合这两个层

人们不知道注释是什么 xml的全功能替换 映射

啊,但他们不是。在我的脑海中,有三个案例(可能还有更多)是你无法(很好地)使用注释的:

  • (无可否认,相当深奥)
  • -@装载机不是适当的替代品。不太常见,但非常有用。Envers提供了一种可行的替代方法
  • 正在丢失架构生成的列顺序。这个绝对是个杀手。我明白为什么会这样做,但这仍然让我非常恼火

  • 不过,别误会我的意思——注释很棒;当它们与验证器相结合时,情况就更糟了(不过,同样,上面的第3条扼杀了这一条的嗡嗡声)。它们还提供了XML映射所不具备的某些功能。

    我曾参与过一个项目,在该项目中,数据库会频繁更改,每次发生更改时,我们都必须重新生成java文件和配置文件。实际上,我们并不使用hibernate工具生成的所有关系和配置。因此,基本上我们使用该工具,然后修改/调整它们


    因此,当您想要修改/调整默认配置时,在XML文件中进行修改比通过注释进行修改更容易。

    因此,如果您想要将类部署到多个数据存储中。您想在其中注释列定义,是吗?不同的数据存储有不同的约定等,在这种情况下,使用XML是唯一明智的选择,可以有一个用于MySQL,一个用于Derby,一个用于Oracle或其他。如果愿意,您仍然可以将基本的持久性/关系注释放入,但在这种情况下,特定于模式的内容将被放入XML中


    --Andy(DataNucleus)

    我觉得如果我们不使用注释,代码的可读性会更高。如果配置信息经常更改,使用注释确实会有所帮助,但以web.xml为例,其中的信息会更改多少次,那么为什么要对servlet使用注释呢。

    我最初发现注释语法非常奇怪。它看起来像是线噪音,和我通常放评论的地方混在一起。不过,这比处理XML文件要好得多,因为所有的更改都在一个地方,即模型文件中。也许注释的一个限制是可能与其他注释发生冲突,但我还没有看到这一点


    我认为它没有被更多地使用的真正原因是它实际上没有被视为默认值。您必须使用一个额外的jar文件。它应该是核心的一部分,XML方法应该是可选的。

    一些信息可以很好地在注释中进行,例如实体之间关系的基数。这些注释提供了关于模型本身的更多细节,而不是模型与其他事物的关系

    但是,绑定,无论是到持久性存储、XML还是其他任何对象,都是模型的外部绑定。它们根据使用模型的上下文而变化。将它们包含在模型中与在HTML中使用内联样式定义一样糟糕。我使用外部绑定(通常不一定是XML)文档的原因与我引用外部CSS的原因相同。

    • 缺少对已映射内容的概述。你需要深入研究源代码

    我切换到注释,但有时我会错过XML映射,主要是因为文档更加全面,有许多场景的示例。对于注释,我坚持使用非常基本的映射(如果您控制数据和对象模型,这很好),但是我在XML中做了一些非常复杂的事情,我不知道是否可以在注释中复制这些事情。

    我们继续使用XML,因为通常对于部署的站点,会获得补丁(二进制代码)批准安装需要您可能没有的时间。对ASCII文件(如xml文件)的更新被视为配置更改,而不是补丁

    我想你已经搞定了