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

时间:2009-12-07 20:25:36

标签: java hibernate orm jpa annotations

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

在少数情况下,这是必要的:

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

但我认为这些并不常见。

我的假设是:

  • 人们习惯于使用xml文件,感觉不舒服/不想学习使用注释方法。
  • Java pre-1.5被强制执行该项目,并且没有任何关于它的事情
  • 人们不知道注释是xml映射的全功能替代品。
  • 支持遗留系统,因此改变方法被认为是有风险的
  • 人们担心将注释(元信息)与他们的类混合是错误的。

还有其他可能的解释吗?

12 个答案:

答案 0 :(得分:50)

域层和持久层被一些人认为是单独的问题。使用纯XML方法可以使两个层尽可能松散耦合;当你在域代码中嵌入了与持久性相关的代码时,使用注释会更紧密地耦合这两层。

答案 1 :(得分:20)

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

答案 2 :(得分:9)

  

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

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

  1. Use formula as part of association key(诚然,相当深奥)。
  2. Join-via-subselect - @Loader不是一个充分的替代品。不是常见但非常有用。 Envers提供了一种可行的替代方法。
  3. 丢失架构生成的列顺序。这是一个绝对的杀手。我理解为什么会这样做,但它仍然让我感到厌烦。
  4. 不要误解我的意思 - 注释很棒;当他们与Validator结合时,他们会加倍(尽管如此,上面的#3会杀死这个问题上的嗡嗡声)。它们还提供了XML映射所不具备的功能的某些方面。

答案 3 :(得分:4)

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

答案 4 :(得分:3)

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

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

答案 5 :(得分:3)

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

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

答案 6 :(得分:3)

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

答案 7 :(得分:2)

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

- 安迪(DataNucleus)

答案 8 :(得分:1)

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

非常好的截屏系列尚未涵盖注释。我用它编写了一些应用程序来学习基础知识,不是为了我的工作,而是出于好奇,但从未迁移到注释。建议仍然与SO相关的系列。如果我有更多的业余时间,我仍然会迁移到注释,但暂时我可以成为提问的人之一。

答案 9 :(得分:1)

我参与了一个数据库频繁更改的项目,我们每次都要重新生成java文件和配置文件。实际上我们并没有使用hibernate工具生成的所有关系和配置。所以基本上我们使用该工具,然后修改/调整它们。

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

答案 10 :(得分:1)

我觉得如果我们不使用Annotations,它会使代码更具可读性。如果配置信息频繁更改,使用Annotations可以提供帮助,但以web.xml为例,该更改中的信息有多少次,那么为什么要为Servlet使用注释。

答案 11 :(得分:0)

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