4

私はjdbcのバックグラウンドを持っており、休止状態を使用することを自分自身に教えることにしました。だから私はシーケンスでテーブルを作りました:

CREATE TABLE TST_PERSON(
ID NUMBER,
NAME VARCHAR(30),
SURNAME VARCHAR(30)
);

CREATE SEQUENCE TST_PERSON_SEQ MINVALUE 1 MAXVALUE 999999999999999999999999999 
INCREMENT BY 1 START WITH 1000 CACHE 20 NOORDER  NOCYCLE ;

とマッピング用の私のJavaコード:

@Entity
@Table(name="TST_PERSON")
public class Person {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO,generator="pers_seq")
    @SequenceGenerator(name="pers_seq",sequenceName="TST_PERSON_SEQ")
    private Long id;

    @Column(name="NAME")
    private String name;

    @Column(name="SURNAME")
    private String surname;
    ... getters and setters ...
}

私の休止状態の構成は次のとおりです。

    <?xml version='1.0' encoding='utf-8'?>
    <!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD//EN"
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

    <hibernate-configuration>
        <session-factory>
            <property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
            <property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:sid</property>
            <property name="hibernate.connection.username">root</property>
            <property name="hibernate.connection.password">root</property>
            <property name="hibernate.connection.pool_size">10</property>
            <property name="show_sql">true</property>
            <property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>
            <property name="hibernate.current_session_context_class">thread</property>
            <mapping class="com.domain.Person"/>
        </session-factory>
    </hibernate-configuration>

しかし、session.saveを呼び出すときにHibernateログによって生成されるSQLを見ると、次のようになっています。

Hibernate: select TST_PERSON_SEQ.nextval from dual
Hibernate: insert into TST_PERSON (NAME, SURNAME, id) values (?, ?, ?)

キャッシュの理由がいくつかあるのではないかと思いましたが、ループを介して保存しようとすると、同じ出力が得られます。

したがって、問題は、挿入ステートメントの一部としてシーケンスを含めるために休止状態を取得する方法です(これは私が意図したことです)。バージョンに関しては、Hibernate4.1.8を使用しています

4

1 に答える 1

4

それは実際には不可能です。簡単な例を見てみましょう。

@SequenceGenerator(name="pers_seq",sequenceName="TST_PERSON_SEQ",allocationSize=10)

割り当てサイズは「INCREMENTBY10」に相当します。挿入ステートメントを使用してID取得クエリを再グループ化する場合は、挿入と同時にデータベースから10番目のID(TST_PERSON_SEQ.nextval)を取得するタイミングを検出する必要があります。

さらに、挿入時のクエリバッチ処理は、同じテーブルのステートメントに対して発生します。

一部のI/Oを保存する場合は、allocationSizeを高く設定し、JDBCバッチモードを使用します(+ order_insertsプロパティは最終的にtrueに設定されます)。このようにして、allocationSizeを10に設定するために、10回の挿入ごとにID取得クエリを実行できます。

于 2013-03-13T12:51:13.987 に答える