1

Oracle シーケンスと Hibernate に問題があります。このコードを使用して、休止状態で Oracle シーケンスを取得しました

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "student_id_seq")
@SequenceGenerator(name = "student_id_seq", sequenceName = "Student_seq")
@Column(name = "StudentID")
public Long getStudentId() {
    return this.studentId;
}

public void setStudentId(Long studentId) {
    this.studentId = studentId;
}

しかし、テーブルに新しい値を挿入すると、生成された値が正しくありません。例: データベースに ID 2 と 3 の 2 つのレコードがあり、新しいレコードを挿入したとき、ID は 4 ではなく 25 でした。どうしたらよいかわかりません。

4

4 に答える 4

6

allocationSizeに設定する必要があります1

@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "student_id_seq")
@SequenceGenerator(name = "student_id_seq", 
                   sequenceName = "Student_seq",
                   allocationSize = 1)  

詳細については、ドキュメントSequenceGenerator docを参照してください。

于 2013-10-25T06:10:53.253 に答える
3

あなたの質問を見ると、私は疑問に思います: ID を 25 ではなく 4 にする必要があるのですか、それとも単に技術的な主キーですか? キャッシュの問題の背後で、シーケンス (id=4) から値を要求してからトランザクションをロールバックすると、次に番号を要求するときに、休止状態またはキャッシュの背後にギャップ (id=5) が生じます。に関連する問題。

Przemyslaw の 2 番目のリンクであるSequence gaps - Oracleで述べられているように、 「ギャップのない数字のシーケンスに近いものを生成するシーケンスを期待してはいけません。それらは、高速で非常にスケーラブルなマルチユーザーの方法で、代理キーを生成します。テーブル。"

私が理解しているように、アプリケーションに連続した値を持つ必要がない場合、「それをどうするか」という質問に対する良い答えは、何もありません。それらのギャップに耐えるだけです。

于 2015-02-24T09:40:19.583 に答える
0

その理由は、シーケンスの作成時に CACHE 値が指定されている可能性があるためです。これはすでに数回質問されています。次の 2 つのリンクを確認してください。

Hibernate でのシーケンス ギャップ

シーケンスギャップ - オラクル

于 2013-10-25T06:10:17.830 に答える
0

次のようなシーケンスをデータベースに作成する必要があります。

CREATE SEQUENCE  "Student_seq"  MINVALUE 0 MAXVALUE 1000000000 INCREMENT BY 1 START WITH 1 CACHE 500 NOORDER  NOCYCLE ;

そしてあなたのstudent.hbm.xml設定でmake:

<class name="StudentPersistant" table="Student">

<id  name="id"  type="java.lang.Long" column="StudentID" >
      <generator class="sequence"> 
           <param name="sequence">Student_seq</param>   
      </generator>
</id>
于 2019-01-22T09:31:16.160 に答える