【问题标题】: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 可能会选择一些内部机制等。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-06-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-07-30
          • 2019-08-05
          • 1970-01-01
          相关资源
          最近更新 更多