hibernate在启动时创建空表 - hibernate_sequence

时间:2015-09-06 14:56:39

标签: mysql hibernate jpa sequences

所以我刚下载了hibernate 5.0.0.1,我尝试了我的项目,之前使用的是hibernate 4.3。

当我插入数据库时​​,它给了我这个错误:

  

错误:无法读取hi值 - 您需要填充表:hibernate_sequence

我正在使用mysql,我的生成策略设置在GenerationType.auto,现在似乎hibernate认为使用序列是生成值的最佳策略。但桌子是空的。我认为hibernate试图从序列中获取值但却找不到任何值。但是我很困惑,因为hibernate创建了hibernate_sequence,它不应该提供初始值吗?

3 个答案:

答案 0 :(得分:21)

序列表是因为您已经在一个/所有实体上定义了主键。

@Id
@GeneratedValue(strategy = GenerationType.AUTO) // or GenerationType.SEQUENCE
protected Long id;

如果您想使用表格的标识栏:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
protected Long id;

您可以查看此主题以获取更多信息: https://forums.hibernate.org/viewtopic.php?f=1&t=999785&start=0

  

@GeneratedValue JPA Annotation

     

在这些教程中,我们经常使用@GeneratedValue   注释使数据库为我们生成唯一的主键。   我们在每个示例中都使用了默认的Generation Type,但是   实际上有四种不同的主要策略   密钥由数据库生成。这四个选项是:

     

AUTO IDENTITY TABLE SEQUENCE javax.persistence.GenerationType.AUTO

     

自动生成策略是默认设置,此设置很简单   选择默认的主键生成策略   有问题的数据库,通常是IDENTITY,但是   它可能是TABLE或SEQUENCE,具体取决于数据库的方式   配置。通常建议使用AUTO策略   您的代码和应用程​​序最便携。

     

javax.persistence.GenerationType.IDENTITY

     

IDENTITY选项只允许数据库生成唯一的   您的应用程序的主键。没有序列或表用于   维护主键信息,而不是数据库   只需为Hibernate选择一个合适的唯一编号即可   实体的主键。使用MySQL,编号最低的第一个   尽管如此,仍然会选择表中可用的主键   此行为可能因数据库而异。

     

javax.persistence.GenerationType.Sequence

     

某些数据库供应商支持使用数据库序列对象   用于维护主键。要使用序列,请设置   GenerationType策略为SEQUENCE,指定生成器的名称   注释,然后提供@SequenceGenerator注释   具有用于定义序列注释名称的属性,   以及数据库中实际序列对象的名称。

答案 1 :(得分:1)

它是创建的,因为Hibernate使用该表来跟踪自动增量Id(ID的下一个值)

实施例 -

@Id
@GeneratedValue
int id;

答案 2 :(得分:-1)

  

简单的解决方案:

将hibernate_sequence表创建为:

"create sequence <schema/db>.hibernate_sequence"