首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Hibernate/Oracle:如何在insert语句中执行序列而不是两个查询

Hibernate/Oracle:如何在insert语句中执行序列而不是两个查询
EN

Stack Overflow用户
提问于 2013-03-13 20:02:37
回答 1查看 4.2K关注 0票数 4

我来自jdbc背景,我决定自学使用hibernate。所以我做了一个带有序列的表格:

代码语言:javascript
复制
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代码:

代码语言:javascript
复制
@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配置是:

代码语言:javascript
复制
    <?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>

但当我查看Hibernate日志在调用session.save时生成的SQL时:

代码语言:javascript
复制
Hibernate: select TST_PERSON_SEQ.nextval from dual
Hibernate: insert into TST_PERSON (NAME, SURNAME, id) values (?, ?, ?)

我认为可能有一些缓存的原因,但当我尝试通过循环保存时,我得到了相同的输出。

因此,问题是如何让hibernate将序列包含在insert语句中(这正是我想要发生的事情)。就版本而言,我使用的是hibernate 4.1.8

EN

Stack Overflow用户

回答已采纳

发布于 2013-03-13 20:51:14

实际上,这是不可能的。让我们举一个简单的例子:

代码语言:javascript
复制
@SequenceGenerator(name="pers_seq",sequenceName="TST_PERSON_SEQ",allocationSize=10)

分配大小相当于“递增10”。如果使用insert语句对ID检索查询进行重新分组,则必须检测与insert语句同时从数据库检索第10个ID (TST_PERSON_SEQ.nextval)的时间。

此外,对于同一个表上的语句,在插入时进行查询批处理。

如果您想保存一些I/O,请设置更高的allocationSize并使用JDBC批处理模式(+ order_inserts属性最终设置为true )。这样,对于设置为10的allocationSize,您将有一个ID检索查询每10次插入。

票数 4
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15384789

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档