我正在 JPA 中冒险,并希望尽可能地保持与数据库无关。我应该避免哪些 orm.xml 功能以保持与数据库无关?
例如,如果我strategy="AUTO"
在 orm.xml 中使用如下:
<id name="id">
<generated-value strategy="AUTO" />
</id>
...然后 MySQL 将其显示为一个AUTO_INCREMENT
列,如果我需要部署到 Oracle,可能(我还不确定)会导致问题。
我正在 JPA 中冒险,并希望尽可能地保持与数据库无关。我应该避免哪些 orm.xml 功能以保持与数据库无关?
例如,如果我strategy="AUTO"
在 orm.xml 中使用如下:
<id name="id">
<generated-value strategy="AUTO" />
</id>
...然后 MySQL 将其显示为一个AUTO_INCREMENT
列,如果我需要部署到 Oracle,可能(我还不确定)会导致问题。
我不熟悉 JPA,但一般来说,一个合理的 ORM 应该是其所有映射的数据库不可知论(对于主要数据库)。
特别是“自动”增量策略应该开箱即用。
切换数据库时,您必须处理现有数据的迁移问题。
一般来说,在选择“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 可能会选择一些内部机制等。
JPA 功能
orm.xml
(例如,如果您想在 oracle 中使用特殊序列),但所有功能都以一种或另一种方式支持,而不会影响代码。这就是 ORM 的好处——你有一个额外的抽象层。保留关键字
保持接近 SQL-92 标准
查询的翻译方式(尤其是本地查询)是松散的。这在某些情况下很好,但有时会导致一些问题:
AS
在本机查询中使用SELECT *
在本机查询中使用=
平等而不是==