Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 休眠序列乘以50生成“@Id”?_Java_Spring_Hibernate - Fatal编程技术网

Java 休眠序列乘以50生成“@Id”?

Java 休眠序列乘以50生成“@Id”?,java,spring,hibernate,Java,Spring,Hibernate,这将创建以下架构: private static final String SEQUENCE = "my_seq"; @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = SEQUENCE) @SequenceGenerator(name = SEQUENCE, sequenceName = SEQUENCE) private Long titId; 观察: 当我将序列的当前值设置为1时,则自动生成的第

这将创建以下架构:

private static final String SEQUENCE = "my_seq";    

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = SEQUENCE)
@SequenceGenerator(name = SEQUENCE, sequenceName = SEQUENCE)
private Long titId;
观察: 当我将序列的
当前值设置为1时,则自动生成的第一个
@Id
50
。当我将值设置为
1000
时,第一个id是
50000


因此,序列的当前值总是乘以
50
。为什么?如何防止这种情况发生,而只使用序列中的nexval?

此行为来自
@SequenceGenerator
,它的参数
allocationSize
的默认值为50。如果需要,可以对其进行更改:

CREATE SEQUENCE my_seq
  INCREMENT 1
  MINVALUE 1
  MAXVALUE 9223372036854775807
  START 1000
  CACHE 1;

这是出于性能原因。它允许Hibernate预订一块id,并防止每次需要新id时询问数据库。

我在Hibernate 5中也遇到了这个问题:

@SequenceGenerator(name = SEQUENCE, sequenceName = SEQUENCE, allocationSize = 42)
private Long titId;
得到如下警告:

发现使用了不推荐的[org.hibernate.id.SequenceHiLoGenerator] 基于序列的id生成器;使用 改为org.hibernate.id.enhanced.SequenceStyleGenerator。看见 有关详细信息,请参阅《Hibernate域模型映射指南》

然后将我的代码更改为
SequenceStyleGenerator

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = SEQUENCE)
@SequenceGenerator(name = SEQUENCE, sequenceName = SEQUENCE)
private Long titId;
这解决了我的两个问题:

1) 已修复不推荐使用的警告
2) 现在根据oracle序列生成id。

但是hibernate应该使用DB提供的值,比如如果hibernate预订了值1-50,那么它应该使用其中的一个。但是为什么它要乘以50呢?
@Id
@GenericGenerator(name="cmrSeq", strategy = "org.hibernate.id.enhanced.SequenceStyleGenerator",
            parameters = {
                    @Parameter(name = "sequence_name", value = "SEQUENCE")}
    )
@GeneratedValue(generator = "sequence_name")
private Long titId;