所以我刚下载了hibernate 5.0.0.1,我尝试了我的项目,之前使用的是hibernate 4.3。
当我插入数据库时,它给了我这个错误:
错误:无法读取hi值 - 您需要填充表:hibernate_sequence
我正在使用mysql,我的生成策略设置在GenerationType.auto,现在似乎hibernate认为使用序列是生成值的最佳策略。但桌子是空的。我认为hibernate试图从序列中获取值但却找不到任何值。但是我很困惑,因为hibernate创建了hibernate_sequence,它不应该提供初始值吗?
答案 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"