web-dev-qa-db-ja.com

HibernateでのGenerationType.AUTOとGenerationType.IDENTITY

現在、データベースとしてmysqlを使用しており、

@Generated Value(strategy = GenerationType.IDENTITY)

特定の状況では完全に機能していますが、その時点でデータベースをOracleに移行する必要がありますが、正常に機能していません。

21

Oracleでどのように「適切に機能する」(それが意味するような基本情報を定義しない)のでしょうか。 AUTOとあなたの質問との関連性はわかりません-それは単に実装が使用したいものを選択できるようにします。

IDENTITY」(JPA javadocsおよび仕様による-参照する必要があるもの)は、autoincrementを意味します。 Oracleにはそのような概念はありませんが、MySQL、SQLServer、および他のいくつかにはあります。私はまともなJPA実装がそのようなことをしようとしてもエラーにフラグを立てることを期待しています。

ただし、Oracleでは「SEQUENCE」または「TABLE」戦略を使用できます。

19
Neil Stockton

引用 Java Persistence/Identity and Sequencing

Identityシーケンスは、データベースでspecial IDENTITYカラムを使用してデータベースが行が挿入されると、オブジェクトにIDを自動的に割り当てます。 ID列は、MySQL、DB2、SQL Server、Sybase、Postgresなどの多くのデータベースでサポートされています。 OracleはIDENTITY列をサポートしていませんが、シーケンスオブジェクトとトリガーを使用してシミュレートできます。

そのため、代わりに[〜#〜] sequence [〜#〜]を使用することを好みます

シーケンスオブジェクトは、特別なデータベースオブジェクトを使用してIDを生成します。シーケンスオブジェクトは、Oracle、DB2、Postgresなどの一部のデータベースでのみサポートされています。通常、SEQUENCEオブジェクトには、名前、INCREMENT、およびその他のデータベースオブジェクト設定があります。 .NEXTVALが選択されるたびに、シーケンスはインクリメントによってインクリメントされます。

例:

@Entity
public class Employee {
    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="EMP_SEQ")
    @SequenceGenerator(name="EMP_SEQ", sequenceName="EMP_SEQ", allocationSize=100)
    private long id;
    ...
}
11
Ahmad Al-Kurdi