gpt4 book ai didi

java - hibernate/甲骨文 : How to make sequence execute within insert statement instead of two queries

转载 作者:搜寻专家 更新时间:2023-11-01 02:49:00 25 4
gpt4 key购买 nike

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

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>

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

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

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

所以问题是我如何让 hibernate 将序列作为插入语句的一部分包含在内(这是我打算发生的)。就版本而言,我使用的是 hibernate 4.1.8

最佳答案

这实际上是不可能的。举个简单的例子:

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

分配大小相当于“INCREMENT BY 10”。如果您使用插入语句重新组合 ID 检索查询,您将必须检测何时应该在插入的同时从数据库中检索第 10 个 ID (TST_PERSON_SEQ.nextval)。

此外,插入时的查询批处理发生在同一个表上的语句。

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

关于java - hibernate/甲骨文 : How to make sequence execute within insert statement instead of two queries,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15384789/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com