2017-08-17 9 views
0

私は、SPRING DATA JPA PagingAndSortingRepositoryを使用して、ORACLEテーブルに対してCRUD操作を実行しています。この例には自動生成IDフィールドがあります。 myrepo.save()を実行すると、投稿された値が保存されますが、IDフィールドが2つ増えたことに気付きました。例えば、jpa pagingonsortingrepository saveが自動生成値を1つスキップします

  1. は私が保存して自動GEN IDが64になってしまった、例
  2. のために、私は2番目のを保存しないと、ID値が、私はそれからやる66
  3. の値を持つことになりますを行います2回目のセーブおよびID値は、値が68

などとなります。私は割り当てサイズを

@SequenceGenerator(name="seq", initialValue=1, allocationSize=1) 

のように追加しようとしましたが、これは助けになりませんでした。私はまだIDが2ずつ増加するのを見ています。

セーブリクエストはオブジェクトを返します。だから私は郵便配達で問題をデバッグするとき、返されたオブジェクトはIDのインクリメントが1であるようですが、DBテーブルで終わるのは郵便配達人の表示値に1を加えたものです。

この奇妙な振る舞いが前に見た。

あなたの助けをありがとう

+0

データベースに保存するオブジェクトの数。複数のエンティティに同じシーケンスを使用しているようです。 – kimy82

+0

こんにちはkimy82;私は一度に1つのオブジェクトを保存しています。 ORACLEテーブルは、その特定のテーブルのTriggerと共に作成された独自のシーケンスを持ち、この1つのエンティティにマップされています。 – jscriptor

答えて

0

それはIdに戦略を配置するのに十分であるはずです。設定しないとデフォルトのものがAUTOになり、AUTOは一種のグローバルインクリメント戦略を使用しているデータベースに責任を与えます。

@Id 
    @GeneratedValue(strategy= GenerationType.TABLE) 
    private Long id; 

これはJavadocのである:

オープン宣言javax.persistence.GenerationType.TABLE

は永続プロバイダが基になるデータベーステーブルを使用して エンティティの主キーを割り当てる必要があることを示し一意性を確保する。

javax.persistence.GenerationType.AUTO

は永続プロバイダが特定のデータベースのための適切な 戦略を選択する必要があることを示します。 AUTO生成戦略では、データベースリソースが存在すると予想するか、データベースリソースの作成を試みる可能性があります( )。 ベンダーは、 にスキーマ生成をサポートしていない、または実行時に スキーマリソースを作成できないというイベントで、そのようなリソースを作成する方法に関するドキュメントを提供することがあります。

私はあなたが直面している問題がSequenceGeneratorがアプリケーションにグローバルであることであると考えてい

1

に役立ちます願っています。他のエンティティで同じ名前のseqを使用している場合は、それらのエンティティもインクリメントします。これに対処するのに適している他の戦略があります。これがエンティティのIDの場合は、@GeneratedValue(strategy=GenerationType.IDENTITY)を使用することをお勧めします。このlinkは、さまざまな種類のGeneratedValuesを提供します。

+0

私はこれがシーケンスを使用するときに問題であることに同意します。ただし、したくない場合は、シーケンスを使用する必要はありません。 – kimy82

+0

こんにちは。 .SEQUENCEを.IDENTITYに置き換え、私がseq nameという名前のユニークな名前を使用していることを確認しました。私はまだ同じ問題を見る。一番わかりにくいのは、POSTMANでステータス200OKとID { "id":117が得られますが、ORACLEテーブルで終わるものは118です。これは奇妙です – jscriptor

+0

あなたのエンティティについてもっと投稿できますか?どのようにそれらを使用していますか? –

関連する問題