我正在使用hibernate 3,oracle 10g.我有一张桌子:主题.定义在这里
CREATE TABLE SUBJECT
(
SUBJECT_ID NUMBER (10),
FNAME VARCHAR2(30) not null,
LNAME VARCHAR2(30) not null,
EMAILADR VARCHAR2 (40),
BIRTHDT DATE not null,
constraint pk_sub primary key(subject_id) USING INDEX TABLESPACE data_index
)
;
Run Code Online (Sandbox Code Playgroud)
当插入新主题时,sub_seq用于创建主题id,定义在这里
create sequence sub_seq
MINVALUE 1
MAXVALUE 999999999999999999999999999
START WITH 1
INCREMENT BY 1
CACHE 100
NOCYCLE ;
Run Code Online (Sandbox Code Playgroud)
Subject类是这样的:
@Entity
@Table(name="ktbs.syn_subject")
public class Subject {
@Id
@Column(name="subject_id")
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SUB_SEQ")
@SequenceGenerator(name="SUB_SEQ", sequenceName = "SUB_SEQ")
private long subjectId;
private String fname;
private String lname;
private String emailadr; …Run Code Online (Sandbox Code Playgroud) 我已将Hibernate配置为使用PostgreSQL序列(通过注释)为主键id列生成值,如下所示:
@Id
@SequenceGenerator(name="pk_sequence",sequenceName="entity_id_seq")
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="pk_sequence")
@Column(name="id", unique=true, nullable=false)
public int getId() {
return this.id;
}
Run Code Online (Sandbox Code Playgroud)
我在这个配置中看到的是,hibernate已经在持久化时分配了id值> 3000,而对使用过的序列的查询显示如下:
database=# select last_value from entity_id_seq;
last_value
------------
69
Run Code Online (Sandbox Code Playgroud)
(1排)
问题:
有什么不对吗?
hibernate应该与序列表同步吗?
如果没有,它在哪里存储最后生成的ID?
谢谢.
我正在研究一种支持多种数据库引擎(Oracle,MSSQL,MySQL)的产品.对于Oracle,我更喜欢使用Sequences而不是Sequence表来避免在高容量安装上出现潜在的并发和锁定问题,但其他数据库引擎不支持序列.此外,我更喜欢每个表使用一个序列而不是全局序列(例如hibernate_sequence),因此@GeneratedValue(strategy = GenerationType.AUTO)不起作用.有没有办法在运行时动态选择策略?
迁移到Hibernate 5.2.7后,我似乎得到了id字段的错误值.
我的代码:
@Id @SearchableId
@GeneratedValue(strategy=GenerationType.AUTO, generator="hms_seq_gen")
@SequenceGenerator(name="hms_seq_gen", sequenceName="patregn_seq")
protected Integer ID;
Run Code Online (Sandbox Code Playgroud)
Hibernate触发此查询:
select nextval ('patregn_seq')
它给出了5367.表中id字段的最后一个值是5358.
我明白了
ERROR: duplicate key value violates unique constraint "patientregistration_pkey"
[java] Detail: Key (id)=(5318) already exists.
我相信这个问题类似于这和这个,但我不得不问,因为给出的解决方案有没有为我工作:
我补充道
<property value="true" name="hibernate.id.new_generator_mappings"/>
到我的persistence.xml,但无济于事.任何帮助将不胜感激.
尝试将Hibernate与SAP HANA内存数据库连接时遇到一些性能问题,该数据库不支持AUTO_INCREMENT(http://scn.sap.com/thread/3238906)。
因此,我将Hibernate设置为使用序列进行ID生成。
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="myseq")
@SequenceGenerator(name="myseq",sequenceName="MY_SEQ",allocationSize=1)
Run Code Online (Sandbox Code Playgroud)
但是当我插入大量记录(例如40000)时,Hibernate首先生成ID。看起来像:
DEBUG Thread-1 org.hibernate.SQL - select MY_SEQ.nextval from DUMMY
DEBUG Thread-1 org.hibernate.id.SequenceGenerator - Sequence identifier generated: BasicHolder[java.lang.Long[92080]]
DEBUG Thread-1 org.hibernate.event.internal.AbstractSaveEventListener - Generated identifier: 92080, using strategy: org.hibernate.id.SequenceHiLoGenerator
DEBUG Thread-1 org.hibernate.SQL - select MY_SEQ.nextval from DUMMY
DEBUG Thread-1 org.hibernate.id.SequenceGenerator - Sequence identifier generated: BasicHolder[java.lang.Long[92081]]
DEBUG Thread-1 org.hibernate.event.internal.AbstractSaveEventListener - Generated identifier: 92081, using strategy: org.hibernate.id.SequenceHiLoGenerator
Run Code Online (Sandbox Code Playgroud)
并且只有在生成所有ID之后,它才开始实际插入。
总共大约需要5分钟才能插入40000条记录(通过网络到远程数据库),这对于内存数据库来说非常慢。我认为发生这种情况是因为Hibernate逐一选择了ID的下一个值:
send a request to database
get id
send next request
...
Run Code Online (Sandbox Code Playgroud)
我想加快ID生成的速度,但是不幸的是,我对ID如何改进它还不够了解。我搜索了可能的解决方案,并发现以下想法:
1)在insert语句中调用sequence.nextval。但是,Hibernate团队说这是不可能的:https : …
我有一个表,其促销 ID 注释为
@SequenceGenerator(name="GEN_PROMID", sequenceName="SEQ_PROMOTIONID", allocationSize=1)
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="GEN_PROMID")
@Column(name="PROMOTIONID")
private Long promotionid;
Run Code Online (Sandbox Code Playgroud)
但即使allocationSize 被指定为1,hibernate 也会不一致地增加数字。以下是数据库中 Promotionid 的最新降序值
1440
1420
1407
1406
1405
1404
1403
1402
1401
1400
1380
1360
1342
1341
1340
1320
1305
Run Code Online (Sandbox Code Playgroud)
我在某处读到 Hibernate 可能会使用 hilo seq_hilo algotihm 和org.hibernate.id.SequenceHiLoGenerator生成器,即使@SequenceGenerator已定义。另请阅读以下链接,我们可以使用它@GenericGenerator来解决链接中的此问题
有人可以在这方面提供详细信息吗?语法@GenericGenerator看起来并不简单。该@SequenceGenerator用还是不用。有时@SequenceGenerator可以完美地工作并生成正确的主键。
附言。我正在使用 Hibernate 3.5 并使用 Oracle 11g DB
编辑
序列码-
CREATE SEQUENCE SEQ_PROMOTIONID
INCREMENT BY 1
START WITH 100;
Run Code Online (Sandbox Code Playgroud)
编辑2
更多分析表明,至少“总是”插入一个可被 20 整除的值。由于Oracle的序列默认缓存为20,因此看起来hibernate的正常增量与缓存值之间存在一些冲突。还观察到,当插入之间有时间间隙时,它通常会转到下一个可被 20 …
该实体在id列上具有以下注释:
@Id
@SequenceGenerator(name = "JOB_MISFIRE_ID_GENERATOR", sequenceName="job_misfire_sequence", allocationSize=10)
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator = "JOB_MISFIRE_ID_GENERATOR")
@Column(unique = true, nullable = false)
private Long id;
Run Code Online (Sandbox Code Playgroud)
在数据库中,我有以下内容:
CREATE SEQUENCE job_misfire_sequence
INCREMENT 10
MINVALUE 1
MAXVALUE 9223372036854775807
START 1
CACHE 1;
Run Code Online (Sandbox Code Playgroud)
序列用于获取列的默认值.
ALTER TABLE job_misfires
ALTER COLUMN id SET DEFAULT nextval('job_misfire_sequence');
Run Code Online (Sandbox Code Playgroud)
当我使用nextval('job_misfire_sequence')手动插入数据库时,一切正常.当序列的当前值为1时,生成以下id值:
SELECT nextval('job_misfire_sequence'); --> 1
SELECT nextval('job_misfire_sequence'); --> 11
SELECT nextval('job_misfire_sequence'); --> 21
SELECT nextval('job_misfire_sequence'); --> 31
Run Code Online (Sandbox Code Playgroud)
但是当hibernate在这个表中插入一行时会发生什么呢?它从这个序列得到了下一个值(在这个场景中是41)并将它乘以10并将其用作id值.这意味着插入的行现在具有id值410.
我究竟做错了什么?这种情况会导致冲突,因为hibernate没有使用序列提供的值.如果我已经理解了correclty
,那么注释中的allocationSize = 10和序列中的INCREMENT 10 的组合应该保证hibernate只需要从序列中每十个值请求一个新值.为什么这不会发生?为什么序列中的值乘以10?
我正在使用
更新1: …
Hibernate 没有按预期从 Oracle 序列中分配对象 ID。这是我在 Hibernate 调试日志中看到的内容。
DEBUG o.h.SQL:92 - select MY_SEQ.nextval from dual
DEBUG o.h.i.e.SequenceStructure:102 - Sequence value obtained: 22643
DEBUG o.h.r.j.i.ResourceRegistryStandardImpl:73 - HHH000387: ResultSet's statement was not registered
DEBUG o.h.e.i.AbstractSaveEventListener:118 - Generated identifier: 22594, using strategy: org.hibernate.id.enhanced.SequenceStyleGenerator
Run Code Online (Sandbox Code Playgroud)
第一个“获得的序列值”是正确的,22643MY_SEQ.nextVal正如它所说的那样。但是随后使用的“生成的标识符”是 22594。什么给出了?
我试过调整生成器策略无济于事。
@Id
@SequenceGenerator(name = "generator", sequenceName = "MY_SEQ")
@GeneratedValue(generator = "generator", strategy = GenerationType.SEQUENCE)
@Column(name = "MY_ID", nullable = false, precision = 6, scale = 0)
private Integer id;
Run Code Online (Sandbox Code Playgroud)
如果有帮助,我可以包含我的 Spring Hibernate 上下文配置。我没有看到任何看起来明显相关的东西。