我正在开始JPA的冒险,并希望尽可能保持数据库不可知。我应该避免使用哪些orm.xml功能来保持数据库不可知?
例如,如果我在orm.xml中使用strategy="AUTO"
,如下所示:
<id name="id">
<generated-value strategy="AUTO" />
</id>
...然后MySQL将其显示为AUTO_INCREMENT
列,如果我需要部署到Oracle,可能(我还不确定)会导致问题。
答案 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功能
orm.xml
(例如,如果您想在oracle中使用特殊序列),但所有功能都支持这种或那种方式,而不会影响代码。这就是ORM的优点 - 你有一个额外的抽象层。保留关键字
保持接近SQL-92标准
查询的翻译方式(尤其是本地查询)是松散的。在某些情况下这很好,但有时会导致一些问题:
AS
SELECT *
=
表示相等,而不是==