1

いくつかの条件に基づいて、新しいレコードをテーブルに追加するときに ID を手動でインクリメントするというかなり単純なタスクがあると思います。

テーブル Book と Chapter があるとします。チャプターには、自動インクリメントする ChapterId、BookId および ChapterNo への外部キーがあります。そして、ブックに章を追加するたびに、この章が属する特定のブックの ChapterNo を 1 ずつ増やします。

これは単純な SQL ステートメントで実行できます: 章 (BookId, ChapterNo) 値 (XXX、BookId = XXX の章から max(ChapterNo) + 1 を選択) に挿入します。しかし、JPAでそれを行い、競合状態を回避する方法はありますか(max ChapterNoを最初に読んでから挿入を行うと発生します)

更新: これまでに思いついた唯一の合理的な解決策: ChapterNo のインクリメントを処理する DB トリガーを実装します。次に、少なくともJPA側でネイティブクエリは必要ありません

4

1 に答える 1

1

完全な解決策ではないかもしれませんが、 @OrderColumnアノテーションを持つ JPA 機能があります。

基本的に、 @OneToMany 関係を List に実装すると、JPA はリスト内の要素の順序をデータベース内の列に保持します。本と章に適用すると、次のようになります。

@Entity
public class Book
{
    ...
    @OneToMany(mappedBy="book")
    @OrderColumn(name="chapterNo")
    private List<Chapter> chapters;
    ...
}

ただし、リストの一部の要素が変更された場合、これにより order 列が多数更新される可能性があることに注意してください。たとえば、最初の章を削除してブックを永続化すると、他のすべての章が更新され、リスト内の新しい位置が反映されます。また、クエリで使用する chapterNo 列に直接アクセスすることはできません。リストのインデックスを介して暗黙的にアクセスするだけです。

于 2013-05-16T22:01:56.950 に答える