是否有充分的理由使用XML而不是通过注释配置hibernate?

时间:2009-01-17 02:03:20

标签: java xml hibernate jpa annotations

我一直在使用Hibernate几年,但只使用它注释,并在我的代码中设置连接参数。

我是否因为不使用XML文件而“遗漏了一些东西”?是否只有XML可用的重要功能?是否有使用XML的情况或模式?

9 个答案:

答案 0 :(得分:7)

我认为你不会错过任何事情是非常安全的。

如果XML中的任何功能无法在属性中表示(我相信有一些罕见的情况),那么您仍然可以选择使用[RawXml]并在属性中编写XML。所以你不可能错过任何功能。

如果团队中有足够的程序员而只是喜欢管理单独的文件,或者如果真的需要动态编辑xml映射,那么使用XML可能是有意义的。对于非常复杂的映射,Xml映射文件可能更容易操作,它们可以包含有用的信息(关于获取策略的注释等)。

还存在架构问题,有些人认为将映射分离为XML文件可以更好地区分业务相关代码和有关如何持久化的指令。

答案 1 :(得分:6)

注释是快速配置Hibernate的好方法。但是像Hibernate这样的OR mappers的一个关键特性就是你保持你的域模型“持久性无知”,你的对象不需要知道它们在何处以及如何持久存在。有些人可能会争辩说,使用注释打破了这一点。在持久性只是众多问题之一的情况下,将事物分开是有意义的。

另一个原因可能是域对象在不同情况下的持久性不同,您可以让一个应用程序使用多个数据库,或者使用相同域模型的更多应用程序。

答案 2 :(得分:5)

Hibernate不使用EJB3 / JPA标准注释吗?如果是这样,我至少可以想到使用XML的一个原因:那些注释没有Hibernate的所有功能。

示例:Hibernate可以为ID定义“本机”类型。这将在MySQL上创建一个自动增量字段,在Oracle上创建一个序列。使用JPA注释无法在两种情况下都能正常工作。

此外,XML是可插拔的。注释不是。如果您运送到多个数据库平台并为每个数据库平台配置不同的配置,这可能对您很重要。

XML已经失去了很多开发人员的青睐,仅此一点,我认为很多人都喜欢注释。事实上,无论如何你都有XML(以persistence.xml文件的形式,可能还有其他文件)。它有点像六个,另外六个。

答案 3 :(得分:1)

在XML注释中几乎没有任何你不能做的注释。我甚至无法想到任何东西。您可以尝试符合JPA,但我发现JPA API非常有限。不过,这只是意味着您使用非标准的Hibernate特定注释。

有几条评论指出hibernate注释会污染您的域模型,但这些注释与数据库布局紧密相关。在任何非数据库驱动的代码中,无论如何都需要构建一个中间层。事实上,恕我直言,许多网络应用程序应该使用中间值对象,只复制表示层所需的数据。相反,许多人在视图反模式中使用open会话。

最后,虽然xml配置很灵活,但通常的做法是每当我们编辑xml文件时,我们几乎总是编辑java源文件。这只是将配置移近对象的另一个参数,即注释。

答案 4 :(得分:0)

我要提到的是,我发现注释的唯一缺点是我必须在我的域模型的类中嵌入相关注释,因此无论使用域模型的任何程序都需要访问API。

但是,出于各种原因,我没有直接坚持我的域模型,而是有一个类似的(但有些不同)“持久域模型”,它会被持久存在并且只存在于服务器中,所以这不是很大问题。

答案 5 :(得分:0)

不想重复已经说过的任何内容,但我使用XML样式配置将其与我的代码分开。这主要是根据我的个人偏好完成的,并且在一天结束时它不重要:)你可以用XML做的另一件事是让hbm2java为你生成你的代码我也喜欢这样,但它又是一个优点;可能不是。

所以我说这只是你喜欢的问题。

答案 6 :(得分:0)

我不知道你是否在配置中包含命名查询,但我倾向于将它们放在XML文件中,即使我认为这会增加实体与其查询之间出错的风险。它允许调整查询而无需重新编译整个应用程序。

如果从业务层到表示层重用实体,使用XML而不是注释也可以避免UI层中的JPA依赖,但我不确定该参数是否相关。

答案 7 :(得分:0)

我发现的一件事是注释似乎更容易使用UUID / GUID列而不是用XML映射它们。但话说回来,我是Hibernate的新手。

答案 8 :(得分:0)

  • 目前无法使用带注释的液体基料。
  • 无法使用注释创建数据库对象,您必须使用

    cfg.addAuxiliaryDatabaseObject(new SimpleAuxiliaryDatabaseObject(... sql here ...))

为了创建一些特殊的sql指令。