相关疑难解决方法(0)

hibernate oracle序列产生很大的差距

我正在使用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)

oracle hibernate sequence gaps-in-data

32
推荐指数
5
解决办法
5万
查看次数

Hibernate使用PostgreSQL序列不会影响序列表

我已将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?

谢谢.

java postgresql orm hibernate hibernate-mapping

26
推荐指数
3
解决办法
4万
查看次数

有没有办法使用JPA注释和Hibernate动态选择@GeneratedValue策略?

我正在研究一种支持多种数据库引擎(Oracle,MSSQL,MySQL)的产品.对于Oracle,我更喜欢使用Sequences而不是Sequence表来避免在高容量安装上出现潜在的并发和锁定问题,但其他数据库引擎不支持序列.此外,我更喜欢每个表使用一个序列而不是全局序列(例如hibernate_sequence),因此@GeneratedValue(strategy = GenerationType.AUTO)不起作用.有没有办法在运行时动态选择策略?

java database hibernate jpa

19
推荐指数
1
解决办法
2万
查看次数

hibernate 5 sequencegenerator没有给出正确的值

迁移到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 sequence hibernate-5.x

9
推荐指数
1
解决办法
7336
查看次数

优化休眠序列ID生成

尝试将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 : …

sql hibernate sequence auto-increment dialect

5
推荐指数
1
解决办法
6597
查看次数

Hibernate 序列生成器不一致

我有一个表,其促销 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 …

oracle hibernate hilo sequence-generators jpa-annotations

5
推荐指数
1
解决办法
2832
查看次数

具有JPA 2序列生成的Postgresql中的奇怪id值

该实体在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?

我正在使用

  • Postgresql 9.0.3
  • Hibernate 3.5.5
  • Hibernate JPA 2.0 api 1.0.0 final

更新1: …

postgresql hibernate sequence jpa-2.0

4
推荐指数
1
解决办法
7707
查看次数

休眠序列 nextVal 已解决但未使用 (Oracle)

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 上下文配置。我没有看到任何看起来明显相关的东西。

Hibernate with Oracle 序列不使用它 …

java oracle spring hibernate sequence

4
推荐指数
1
解决办法
5548
查看次数