H2序列在列[JPA Spring]中生成否定编号

问题描述 投票:0回答:1

我试图插入H2数据库表,其中有两个表

  1. 父(ID,姓名)
  2. 儿童(ID,PARENTID,名称)

我已经为这两个表定义了序列脚本。

  1. 创建序列parent_seq以1递增1开始;
  2. 创建序列child_seq以1增量1开始;

我必须为父母和孩子的bean类

根:

@Entity
public class Root{

@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="abstract_generator")
private Long id;

//getter setter for Id
}

家长:

@Entity
@Access(AccessType.FIELD)
@Table(name="PARENT")
@SequenceGenerator(name="abstract_generator",sequenceName="parent_seq")
@NamedQuery(name="parent.findAll",query="select q from parent q")
public class Parent extends Root{

@Column(name="Name")
private String name;

public void setName(String name){
this.name=name;
}
}

儿童:

    @Entity
    @Access(AccessType.FIELD)
    @Table(name="CHILD")
    @SequenceGenerator(name="abstract_generator",sequenceName="child_seq")
    @NamedQuery(name="child.findAll",query="select q from child q")
    public class child extends Root{

    @Column(name="Name")
    private String name;

    @Column(name="ParentId")
    private Long parentId;

    //getter setter for Parentid and name
}

我的父类和子类从root获取id,root类为每个类生成id。

现在问题是当系统试图插入Id的值时,我得到负值。

进入结果:

id名称

1 abc

-98 KJD

-97 Dzaf

-96 Dz

我只是想知道为什么它会进入负值。我找不到原因。我调试了整个代码,但仍然在努力找出原因。

java mysql spring hibernate jpa
1个回答
1
投票

之所以发生这种情况,是因为JPA Properties没有与数据库序列同步。

所以首先用JPA hibernate映射:

Properties prop=new Properties();
prop.put("hibernate.dialect","H2");
prop.put("hibernate.show_sql","true");
prop.put("hibernate.format_sql","true");
prop.put("hibernate.jdbc.batch_size",batchSize);
prop.put("hibernatae.order_inserts","true");
prop.put("hibernatae.order_updates","true");
prop.put("hibernate.jdbc.batch_versioned_data","true");
prop.put("hibernate.id.new_generator_mappings","true");

第二个设置allocationSize,以便它可以与序列同步:

CREATE SEQUENCE parent_seq START WITH 1 INCREMENT BY 10;

所以用你的bean / Model类设置allocationSize

家长:

@Entity
@Access(AccessType.FIELD)
@Table(name="PARENT")
@SequenceGenerator(name="abstract_generator",sequenceName="parent_seq",allocationSize=10)
@NamedQuery(name="parent.findAll",query="select q from parent q")
public class Parent extends Root{

@Column(name="Name")
private String name;

public void setName(String name){
this.name=name;
}
}

我的问题是hibernate映射没有与数据库正确同步。这就是为什么一些随机负数将成为数据库中的主键。

© www.soinside.com 2019 - 2024. All rights reserved.