2013-03-13 24 views
4

我來自jdbc背景,我決定教我自己使用hibernate。所以我做了一桌子的序列:Hibernate/Oracle:如何在插入語句而不是兩個查詢中執行序列

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 ... 
} 

我Hibernate的配置是:

<?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> 

但是,當我看着SQL在調用session.save時由休眠日誌生成:

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

我認爲可能有一些緩存的原因,但當我試圖通過循環保存時,我得到相同的輸出。

所以問題是如何讓hibernate將序列作爲插入語句的一部分包含進來(這正是我想要發生的)。在我使用的版本中休眠4.1.8

回答

4

這實際上是不可能的。我們舉一個簡單的例子:

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

分配大小等於「增加10」。如果使用insert語句重新分組ID檢索查詢,則必須檢測何時應該從數據庫中檢索第10個ID(TST_PERSON_SEQ.nextval)的時間,而不是與插入相同。

而且,針對同一個表上的語句進行查詢批量插入操作。

如果要保存一些I/O,請設置較高的分配大小並使用JDBC批處理模式(最終將+ order_inserts屬性設置爲true)。這樣你將有一個ID檢索查詢每10個插入的分配大小設置爲10.

相關問題