7

データベースに永続化するためにエンティティとしてマップされたクラスがあります。主キーとして id フィールドがあるため、オブジェクトが永続化されるたびに、次のようなコードである "myClass_pk_seq" シーケンスから id の値が取得されます。

@Entity
@Table(name="myObjects")
public class MyClass {
    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="sequence")
    @SequenceGenerator(name="sequence", sequenceName="myClass_pk_seq", allocationSize=1)
    @Column(name="myClassId")
    private Integer id;

    private Integer code;


    ...
}

「コード」属性でidに似たものを作成する必要があります。シーケンスの次の値をコードに割り当てることができるように、シーケンスが必要です (ユーザーがその値を予約したいが、データを保持しない場合に備えてその値を予約するため)。何を入力すればよいかわからない場合は、ユーザーがボタンを押して画面で次の可能な値を受け取ることができます (そして、ユーザーはそれを受け入れるかどうかに関係なく) フィールドが表示されます。主キー以外のフィールドのデータを永続化せずに、JPA で定義されたシーケンスの次の値を取得する (およびその値をインクリメントする) にはどうすればよいですか?

「コード」フィールドに関連付けられたシーケンスで nextval を呼び出し、値を返すメソッドが必要です。アノテーションを使用してJPAでそれを行う最良の方法は何ですか?

ありがとう。

4

2 に答える 2

4

「コード」フィールドに関連付けられたシーケンスで nextval を呼び出し、値を返すメソッドが必要です。アノテーションを使用してJPAでそれを行う最良の方法は何ですか?

  • ユーザーがボタンを押したときに、ネイティブ SQL を使用して次のシーケンス値を取得します。シーケンスを手動で作成するか、「偽のエンティティ」を使用して JPA に作成させます。
  • ネイティブ SQL を使用したくない場合は、シーケンスに依存するエンティティを挿入し、その ID を取得します。

どちらのソリューションも少し見苦しく聞こえます。UUID ジェネレーターのようなランダム ジェネレーターを使用することもできます。

実際には、の一意性については何も言及していませんでしたcode(JPA 注釈は、それが一意である必要があることを示していません)。ランダムな int を返さないのはなぜですか?

于 2010-06-18T10:50:33.283 に答える