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

时间:2017-12-19 22:22:03

标签: java mysql spring hibernate jpa

我正在尝试插入H2数据库表,其中有两个表

  1. 父(ID,姓名)
  2. 子(ID,PARENTID,名称)
  3. 我已经为这两个表定义了序列脚本。

    1. 创建序列 parent_seq 以1加1开始;
    2. 创建序列 child_seq 以1加1开始;
    3. 我必须为父母和孩子的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 djhf

      -96 djh

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

1 个答案:

答案 0 :(得分: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映射未与数据库正确同步。这就是为什么一些随机负数将成为数据库中的主键。