Hibernate错误生成自动id增量

时间:2015-04-29 07:13:15

标签: java hibernate

我不确定发生了什么,但有一天Hibernate开始错误地在Osoba中生成自动ID。

我的意思是当我添加人(Osoba)时他得到ID 60,下一个得到64但是它应该得到61 ...我该如何解决这个问题?所以它会增加1,不增加4,或者像现在这样增加......还有我怎样才能重置" ID值?我想清理整个表格,并从ID 1开始计算

<class name="Osoba" table="DANEOSOBOWE">

        <id name="id" type="int" column="id">
                <generator class="native"/>
                </id>
public class Osoba implements Interface {

    private int id;
    private String imie;
    private String nazwisko;
    private String email;
    private String telefon;
    private String uczelnia;
    private String doswiadczenie;    
    private String skadSlyszal;
    private List zainteresowania = new ArrayList(); 

  public Osoba(){ // domyslny    
  }

  // konstruktor zeby mozna bylo sobie w jednej linijce dodawac osobe
   public Osoba(String imie1, String nazwisko1, String telefon1, String email1, String uczelnia1, String doswiadczenie1, String skadSlyszal1 ){
       this.imie = imie1;
       this.nazwisko = nazwisko1;
       this.email = email1;
       this.telefon = telefon1;
       this.uczelnia = uczelnia1;
       this.doswiadczenie = doswiadczenie1;
       this.skadSlyszal = skadSlyszal1;
       }

3 个答案:

答案 0 :(得分:2)

Native:此生成策略是默认。它只选择主键生成策略,该策略是相关数据库的默认值,通常为IDENTITY,尽管它可能是TABLESEQUENCE,具体取决于数据库的配置方式。通常建议使用本机策略,因为它使您的代码和应用程​​序最具可移植性。

例如:在Mysql中,如果主键列为auto_increment,则将使用此策略更新数据库。

答案 1 :(得分:2)

使用注释 -

@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="course_seq")
@SequenceGenerator(
    name="course_seq",
    sequenceName="course_sequence",
    allocationSize=1
)
private int id;

分配大小为1会使其增加1。

答案 2 :(得分:1)

我遇到了同样的问题,但是增量是32而不是4:我通过关闭sessionFactory来解决它。我使用的是H2数据库,所以这里是文档的链接: http://www.h2database.com/html/grammar.html#set_cache_size

它说:

  

缓存是预先分配的数字的数量。如果系统在没有关闭数据库的情况下崩溃,那么最多会丢失许多数字。默认缓存大小为32.要禁用缓存,请使用缓存大小为1或更低。

所以当我在我的sessionFactory方法中没有关闭Main时,增量为32,但是当我开始关闭它时,它起作用了。我重新创建了数据库,它工作正常。当我查看INFORMATION_SCHEMA.SEQUENCES表,这是具有数据库序列生成属性的表时,我看到了那个魔法CACHE_SIZE = 32

因此,每次数据库未正确关闭时,序列都会丢失32个数字。