应该避免使用哪些orm.xml功能来保持数据库不可知?

时间:2010-02-25 00:34:50

标签: database orm jpa database-agnostic

我正在开始JPA的冒险,并希望尽可能保持数据库不可知。我应该避免使用哪些orm.xml功能来保持数据库不可知?

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

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

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

3 个答案:

答案 0 :(得分:1)

我不熟悉JPA,但一般来说,合理的ORM应该与所有映射的数据库无关(对于主要数据库)。

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

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

答案 1 :(得分:1)

一般情况下,在选择“IDENTITY”的值生成时,以及在Sybase SERIAL和DB2上等时,应该使用MySQL“AUTO_INCREMENT”。等等。某些RDBMS没有等效的东西。

“AUTO”的值生成是为了实现选择最适合该数据存储的内容。是的,在MySQL上,他们可以选择AUTO_INCREMENT,在Sybase SERIAL和Oracle SEQUENCE等上,但从用户代码的角度来看,一个人(应该)可以选择任何符合规范的实现。显然你不能再切换JPA实现并期望它使用完全相同的机制,因为JPA impl#1可以在MySQL上选择AUTO_INCREMENT,而JPA impl#2可以选择一些内部机制等等。

答案 2 :(得分:1)

JPA功能

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

保留关键字

  • 请勿使用保留字来命名表格和列

保持接近SQL-92标准

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

  • 不要在原生查询中使用AS
  • 永远不要在原生查询中使用SELECT *
  • 用户=表示相等,而不是==
  • 仅使用SQL-92标准函数