Google Cloud PlatformからOracle Cloud Infrastructureに乗り換えつつありますが、RDBもCloud SQLのPostgreSQLからAutonomous Databaseに移行しています。Spring Data JPAでちょっと苦労したので書き残しておきます。
PostgreSQL
PostgreSQLではシリアルデータ型を列に指定することで、データインサート時にテーブル作成時自動的に作成されたシーケンスから採番した値をシリアルデータ型の列に格納してくれる機能があります。
CREATE TABLE user (
id SERIAL NOT NULL,
...
);
Spring Data JPAのEntityクラスでは
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
...
}
のようにIdアノテーションとGeneratedValueアノテーションを指定することでシーケンスから採番した値をidに設定することができます。
Autonomous Database
Autonomous Databaseにはシリアルデータ型と同様のものはないので別の方法に変更しますが、使い勝手が変わらないようにデータベースのシーケンスから採番する方法とします。
CREATE TABLE user (
id NUMBER NOT NULL,
...
);
自動的には作成されないのでシーケンスを作成します。
CREATE SEQUENCE user_id_seq;
Spring Data JPAのEntityクラスは
public class User {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "user_id_generator")
@SequenceGenerator(name = "user_id_generator", sequenceName = "user_id_seq", allocationSize = 1)
@Column(name = "id")
private Long id;
...
}
のようにstrategyにGenerationType.SEQUENCEを、SequenceGeneratorアノテーションのsequenceNameに上記で作成したシーケンスを指定します。
シーケンスを指定しない場合はhibernate_sequenceが作成され使われます。採番が必要なテーブルが少なければhibernate_sequenceを使うのでも良いでしょう。