私は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を使用しています