作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有 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/
我是一名优秀的程序员,十分优秀!