【问题标题】:What orm.xml features should be avoided to stay database agnostic?应该避免哪些 orm.xml 特性以保持与数据库无关?
【发布时间】:2010-02-25 00:34:49
【问题描述】:
我正在 JPA 中冒险,并希望尽可能地保持与数据库无关。我应该避免哪些 orm.xml 功能以保持与数据库无关?
例如,如果我在 orm.xml 中使用strategy="AUTO" 如下:
<id name="id">
<generated-value strategy="AUTO" />
</id>
...然后 MySQL 将其显示为 AUTO_INCREMENT 列,如果我需要部署到 Oracle,可能(我还不确定)会导致问题。
【问题讨论】:
标签:
database
orm
jpa
database-agnostic
【解决方案1】:
JPA 功能
- 您可以使用所有 JPA 功能。更糟糕的是,您需要更改注释或
orm.xml(例如,如果您想在 oracle 中使用特殊序列),但所有功能都以一种或另一种方式支持,而不会影响 代码。这就是 ORM 的好处——你有一个额外的抽象层。
保留关键字
接近 SQL-92 标准
查询的翻译方式(尤其是本地查询)是松散的。这在某些情况下很好,但有时会导致一些问题:
- 不要在原生查询中使用
AS
- 切勿在本机查询中使用
SELECT *
- 用户
= 表示平等,而不是==
- 仅使用 SQL-92 标准函数
【解决方案2】:
我不熟悉 JPA,但一般来说,一个合理的 ORM 应该是其所有映射的数据库不可知论(对于主要数据库)。
尤其是“自动”增量策略应该开箱即用..
在切换数据库时,您必须处理现有数据的迁移问题。
【解决方案3】:
一般来说,在选择“IDENTITY”的值生成时,应使用 MySQL“AUTO_INCREMENT”,在 Sybase SERIAL 和 DB2 ... 等上。一些 RDBMS 没有等效的东西。
“AUTO”的值生成是为了让实施选择最适合该数据存储的内容。是的,在 MySQL 上,他们可以选择 AUTO_INCREMENT,在 Sybase SERIAL 上,以及在 Oracle SEQUENCE 等上,但从用户代码的角度来看,一个人将(应该)在任何符合规范的实现上工作。显然你不能切换 JPA 实现并期望它使用完全相同的机制,因为 JPA impl #1 可能会在 MySQL 上选择 AUTO_INCREMENT,而 JPA impl #2 可能会选择一些内部机制等。