我一直在使用Hibernate几年,但只使用它注释,并在我的代码中设置连接参数。
我是否因为不使用XML文件而“遗漏了一些东西”?是否只有XML可用的重要功能?是否有使用XML的情况或模式?
答案 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指令。