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

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

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

  • 您正在使用提供的类,并且想要映射它们。
  • 您正在编写一个API,其域类可以在没有JPA提供程序的情况下使用,因此您不希望强制使用JPA / Hibernate依赖项。

但我认为这些并不常见。

我的假设是:

  • 人们习惯于XML文件,不舒服/不想学习使用注释的方法。
  • Java 1.5之前的版本被强加在这个项目上,而且没有什么可做的
  • 人们不知道注释是一个全function的XML映射replace。
  • 遗留系统得到支持,因此改变方法被认为是有风险的
  • 人们担心混合注解(元信息)与他们的类是错误的。

任何其他可能的解释?

领域层和持久层被一些人认为是单独的关注点。 使用纯粹的XML方法,尽可能松散地耦合两层; 使用注释将两层更紧密地结合在一起,因为您在域代码中embedded了与持久性相关的代码。

  • 缺乏对已经映射的内容的概述。 你需要挖掘源代码。

人们不知道注释是一个全function的XML映射replace。

啊,但他们不是。 我的头顶有三个案例(可能还有更多),你不能用注释去做(好):

  1. 使用公式作为关联密钥的一部分 (诚​​然,相当深奥)。
  2. Join-via-subselect – @Loader不是一个合适的替代品。 不太常见,但相当有用。 Envers提供了一种可行的替代方法。
  3. 丢失图表生成的列顺序。 这是一个绝对的杀手。 我明白为什么这样做,但它仍然让我感到不安。

不要误会我的意思 – 注释很棒; 当它们与Validator配合使用的时候也是双倍的(尽pipe如此,上面的#3还是杀死了这个嗡嗡声)。 它们还提供了XML映射所不具备的某些function方面。

使用XML来补充需要环境或系统特定configuration的注释。

我最初发现注释语法很奇怪。 它看起来像线噪声,并混入我通常发表评论的地方。 这比处理XML文件要好得多,因为所有的改变都在一个地方,就是模型文件。 也许注释的一个限制是可能与其他注释相冲突,但我还没有看到。

我认为它没有被更多使用的真正原因是它不被认为是默认的。 你必须使用额外的jar文件。 它应该是核心的一部分,XML方法应该是可选的。

所以如果你想把你的类部署到多个数据存储。 你想注释列定义到它吗? 不同的数据存储具有不同的约定等,使用XML是唯一的理智的地方,能够有一个用于MySQL,一个用于德比,一个用于Oracle或其他。 如果你愿意的话,你仍然可以把基本的持久性/关系注释放进去,但是在这种情况下,特定于模式的东西就会进入XML。

– 安迪(DataNucleus)

一些信息在注释中被很好的传递,比如实体之间关系的基数。 这些注释提供了关于模型本身的更多细节,而不是模型如何与其他内容相关。

但是,绑定,无论是持久存储还是XML或其他任何东西,都是模型的外在。 它们根据使用模型的上下文而改变。 将它们包含在模型中与在HTML中使用内联样式定义一样糟糕。 我使用外部绑定(通常 – 虽然不一定是XML)文档,因为我引用外部CSS。

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

我有一个新的: http : //www.summerofnhibernate.com/

非常好的截屏video系列尚未覆盖注释。 我已经写了一些应用程序来学习基础知识,不是为了我的工作,而是出于好奇,但从来没有迁移到注释。 build议在SO上仍然相关的系列。 如果我有更多的闲暇时间,我仍然会转移到注释,但是暂时我可能会成为其中一个问题的人。

我曾经在一个数据库会频繁更改的项目上工作,每次发生时都必须重新生成java文件和configuration文件。 其实我们并没有使用hibernate工具生成的所有关系和configuration。 所以基本上我们使用该工具,然后修改/调整它们。

所以,当你想修改/调整默认configuration时,在XML文件中做相比通过注释做起来更容易。

我觉得如果我们不使用Annotations的话,它会使代码更加可读。如果configuration信息经常变化,Annotations的使用可以真正起到帮助作用,但是以web.xml为例,这个信息有多less次变化,那么为什么为Servlet使用注释。

我们继续使用XML,因为通常对于已部署的站点,获取批准安装的补丁(二进制代码)需要时间,而您可能没有这个补丁。 对ASCII文件(例如xml文件)的更新被认为是configuration更改,而不是修补程序…

Ť