我在liquibase
更改日志中定义了一个序列,但在插入实体时看起来Hibernate
忽略了它。
Liquibase中定义的序列如下所示。
<createSequence cycle="false" incrementBy="1"
startValue="1" maxValue="9223372036854775807" minValue="1"
sequenceName="seq_vehicle" />
在Entity类中。
@Entity
@Table(name = "VEHICLE")
public class Vehicle {
@Id
@Column(name = "ID")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "VEHICLE_SEQ")
@SequenceGenerator(name = "VEHICLE_SEQ", sequenceName = "SEQ_VEHICLE")
private Long id;
我还将此属性添加到hibernate.cfg.xml
<property name="hibernate.id.new_generator_mappings">false</property>
问题在于,无论何时向DB插入新实体,它都会忽略Liquibase序列,从50开始,对任何新插入都增加50。我该如何解决这个问题?
答案 0 :(得分:0)
使用@GenericGenerator
代替@SequenceGenerator
。
@Id
@Column
@GenericGenerator(
name = "VEHICLE_SEQ",
strategy = "sequence",
parameters = {
@org.hibernate.annotations.Parameter(name = "sequence", value = "SEQ_VEHICLE")
}
)
@GeneratedValue(generator = "VEHICLE_SEQ")
private Long id;
你的案例中的@SequenceGenerator
是hibernate的HILO机制,默认情况下,它使用默认分配大小50,这就是为什么你看到id值中的空白ID为数据库的原因。
答案 1 :(得分:0)
只需添加allocationSize = 1
:
@Id
@Column(name = "ID")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "VEHICLE_SEQ")
@SequenceGenerator(name = "VEHICLE_SEQ", sequenceName = "SEQ_VEHICLE", allocationSize = 1)
private Long id;
正如@veljkost所解释的那样,allocationSize
is 50的默认值。