0

我正在 JPA 中冒险,并希望尽可能地保持与数据库无关。我应该避免哪些 orm.xml 功能以保持与数据库无关?

例如,如果我strategy="AUTO"在 orm.xml 中使用如下:

<id name="id">
    <generated-value strategy="AUTO" />
</id>

...然后 MySQL 将其显示为一个AUTO_INCREMENT列,如果我需要部署到 Oracle,可能(我还不确定)会导致问题。

4

3 回答 3

1

我不熟悉 JPA,但一般来说,一个合理的 ORM 应该是其所有映射的数据库不可知论(对于主要数据库)。

特别是“自动”增量策略应该开箱即用。

切换数据库时,您必须处理现有数据的迁移问题。

于 2010-02-25T00:45:38.233 回答
1

一般来说,在选择“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 可能会选择一些内部机制等。

于 2010-02-25T15:35:50.030 回答
1

JPA 功能

  • 您可以使用所有 JPA 功能。更糟糕的是,您将需要更改注释或orm.xml(例如,如果您想在 oracle 中使用特殊序列),但所有功能都以一种或另一种方式支持,而不会影响代码。这就是 ORM 的好处——你有一个额外的抽象层。

保留关键字

  • 不要使用保留字来命名您的表和列

保持接近 SQL-92 标准

查询的翻译方式(尤其是本地查询)是松散的。这在某些情况下很好,但有时会导致一些问题:

  • 不要AS在本机查询中使用
  • 切勿SELECT *在本机查询中使用
  • 用户=平等而不是==
  • 仅使用 SQL-92 标准函数
于 2010-02-25T15:49:01.987 回答