【发布时间】:2014-05-26 08:10:58
【问题描述】:
对于业务逻辑,我们需要使用直接在数据库中而不是在 Hibernate 中定义的序列中的下一个值来更新记录(因为并不总是应用于插入/更新)
为此,我们在 PostgreSQL 中定义了一个序列,其 DDL 为:
CREATE SEQUENCE public.facturaproveedor_numeracionperiodofiscal_seq
INCREMENT 1 MINVALUE 1
MAXVALUE 9223372036854775807 START 1
CACHE 1;
然后在DAO中,当某些条件为真时,我们通过:
Query query = sesion.createSQLQuery("SELECT nextval('facturaproveedor_numeracionperiodofiscal_seq')");
Long siguiente = ((BigInteger) query.uniqueResult()).longValue();
但是分配的值不是连续的。查看 Hibernate 输出日志,我们看到在同一事务中对序列进行了四次提取:
Hibernate: SELECT nextval('facturaproveedor_numeracionperiodofiscal_seq') as num
Hibernate: SELECT nextval('facturaproveedor_numeracionperiodofiscal_seq') as num
Hibernate: SELECT nextval('facturaproveedor_numeracionperiodofiscal_seq') as num
Hibernate: SELECT nextval('facturaproveedor_numeracionperiodofiscal_seq') as num
为什么会这样?这是为了捕捉目的吗?有办法禁用这个吗?或者这个解决方法不正确?
【问题讨论】:
标签: java sql hibernate postgresql