Spring-Boot2.0.0は変更されたようですHibernateは自動設定されます。
2つのシンプルで独立したJPAエンティティを想定します。
@Entity
class Car {
@Id
@GeneratedValue
private long id;
//....
}
@Entity
class Airplane {
@Id
@GeneratedValue
private long id;
//....
}
以前は、Spring-Boot1.5.10を使用して、自動インクリメントの個別のシーケンスを生成できました。つまり、Car
with1を主キーとし、Airplane
with1主キーとしても。それらの間に相関関係はありません。たとえば、共有シーケンスはありません。
さて、2.0.0で、最初のCar
を順番に作成してから、最初のAirplane
を順番に作成すると、車はIDとして1を取得し、飛行機は2を取得します。
彼はGeneratedType.AUTO
を処理する必要があるようです。これは@GeneratedValue
注釈ソース内で指定された「デフォルトで使用」です。
ただし、GeneratedType.AUTO
も1.5.10でデフォルトとして設定されているため、私の推論はここで止まったようです。
私の期待に応える簡単な回避策は、次のようにIDENTITY
戦略タイプの生成を指定することです。
@Entity
class Car {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
//....
}
@Entity
class Airplane {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
//....
}
この動作の説明がわかりません。
このシナリオを説明する、Spring-boot2.0.0の変更点
Spring Boot 2.0はHibernate 5.2を使用します( https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0-Release-Notes )。
HibernateはGeneratedType.AUTO
5.2以降の戦略。シーケンスをネイティブにサポートしないデータベース(MySQLなど)は、IDENTITYの代わりにTABLEジェネレーターを使用します。 ( https://hibernate.atlassian.net/browse/HHH-11014 )
それが理由です GeneratedType.AUTO
は期待どおりに機能しません。
Andrewがコメントで指摘したように、他のテーブルで値が作成されている間にIDを増やしたくない場合は、次のようにIDを指定できます。
@Id
@GeneratedValue(
strategy= GenerationType.AUTO,
generator="native"
)
@GenericGenerator(
name = "native",
strategy = "native"
)
private Long id;
これを行うと、各テーブルの一意のIDが1,2,3 ...で始まるようになります。
この問題の発生を防ぐために、将来性のない迅速なソリューションが必要な場合:
spring.jpa.hibernate.use-new-id-generator-mappings=false
、Spring Boot 2ドキュメントから:
spring.jpa.hibernate.use-new-id-generator-mappings= # Whether to use Hibernate's newer IdentifierGenerator for AUTO, TABLE and SEQUENCE.
これにより、新しいジェネレーターを使用できなくなり、Spring boot 1.x.xに含まれる古い機能が維持されます。
これはおそらく最善の解決策ではありませんが、短期的には非常に役立つことに注意してください