我不确定发生了什么,但有一天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;
}
答案 0 :(得分:2)
Native:此生成策略是默认。它只选择主键生成策略,该策略是相关数据库的默认值,通常为IDENTITY
,尽管它可能是TABLE
或SEQUENCE
,具体取决于数据库的配置方式。通常建议使用本机策略,因为它使您的代码和应用程序最具可移植性。
例如:在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个数字。