web-dev-qa-db-ja.com

Spring-bootは、@ GeneratedValueを介したIDの自動インクリメントの動作方法を変更しましたか?

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.AUTO1.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の変更点

13

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は期待どおりに機能しません。

12
Min Hyoung Hong

Andrewがコメントで指摘したように、他のテーブルで値が作成されている間にIDを増やしたくない場合は、次のようにIDを指定できます。

@Id
@GeneratedValue(
    strategy= GenerationType.AUTO,
    generator="native"
)
@GenericGenerator(
    name = "native",
    strategy = "native"
)
private Long id;

これを行うと、各テーブルの一意のIDが1,2,3 ...で始まるようになります。

0

この問題の発生を防ぐために、将来性のない迅速なソリューションが必要な場合:

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に含まれる古い機能が維持されます。

これはおそらく最善の解決策ではありませんが、短期的には非常に役立つことに注意してください

0
Nick