我尝试使用spring 4.2
版本在我的项目中将hibernate从4升级到5。在升级之后,当我调用更新方法时,我在堆栈跟踪中发现了以下错误。
10:53:32,185 ERROR TableStructure:149 - could not read a hi value
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'test.hibernate_sequence' doesn't exist
我用注释
更改了自动递增的Id@GeneratedValue(strategy=GenerationType.AUTO)
仍然存在错误。
答案 0 :(得分:107)
你也可以把:
@GeneratedValue(strategy = GenerationType.IDENTITY)
让DateBase管理主键的增量:
AUTO_INCREMENT PRIMARY KEY
答案 1 :(得分:73)
答案 2 :(得分:39)
使用 Spring Boot
将下面的字符串放在.application.properties
中spring.jpa.properties.hibernate.id.new_generator_mappings=false
在Hibernate 4.X上,此属性默认为true
。
答案 3 :(得分:21)
这就是出现此错误的原因:
它将查找您使用的数据库如何生成ID。对于MySql或HSQSL,有增量字段自动递增。在Postgres或Oracle中,它们使用序列表。由于您没有指定序列表名称,因此它将查找名为hibernate_sequence的序列表并将其用作默认值。所以你可能在数据库中没有这样的序列表,现在你得到了这个错误。
答案 4 :(得分:14)
我收到了同样的错误" com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:Table' mylocaldb.hibernate_sequence'不存在"。
使用spring mvc 4.3.7和hibernate 5.2.9版,应用程序是使用基于spring java的配置。现在我必须在我的代码中添加@Eva Mariam提到的hibernate.id.new_generator_mappings
属性,如下所示:
@Autowired
@Bean(name = "sessionFactory")
public SessionFactory getSessionFactory(DataSource dataSource) {
LocalSessionFactoryBuilder sessionBuilder = new LocalSessionFactoryBuilder(dataSource);
sessionBuilder.addProperties(getHibernateProperties());
sessionBuilder.addAnnotatedClasses(User.class);
return sessionBuilder.buildSessionFactory();
}
private Properties getHibernateProperties() {
Properties properties = new Properties();
properties.put("hibernate.show_sql", "true");
properties.put("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
properties.put("hibernate.id.new_generator_mappings","false");
return properties;
}
它就像魅力一样。
答案 5 :(得分:12)
FYI
如果您使用hbm文件来定义O / R映射。
请注意:
在Hibernate 5中,序列名称的参数名称已更改。
以下设置在 Hibernate 4 :
中正常工作<generator class="sequence">
<param name="sequence">xxxxxx_seq</param>
</generator>
但是在 Hibernate 5 中,相同的映射设置文件会导致“hibernate_sequence不存在”错误。
要修复此错误,参数名称必须更改为:
<generator class="sequence">
<param name="sequence_name">xxxxxx_seq</param>
</generator>
这个问题浪费了我2,3个小时。
不知何故,它似乎有没有文件。
我必须阅读org.hibernate.id.enhanced.SequenceStyleGenerator的源代码才能弄明白
答案 6 :(得分:4)
在hibernate 5.x中,你应该在hibernate.cfg.xml中将set hibernate.id.new_generator_mappings添加为false
<session-factory>
......
<property name="show_sql">1</property>
<property name="hibernate.id.new_generator_mappings">false</property>
......
</session-factory>
答案 7 :(得分:3)
使用时
@GeneratedValue(strategy=GenerationType.AUTO)
或
@GeneratedValue
是上述的简化方法,Hibernate开始决定最好的方法
生成策略,在这种情况下,它已选择
GenerationType.SEQUENCE
作为策略,这就是它寻找
schemaName.hibernate_sequence
是一个表格,用于基于序列的ID生成。
使用GenerationType.SEQUENCE
作为策略时,您需要按以下方式提供@TableGenerator
。
@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "user_table_generator")
@TableGenerator(name = "user_table_generator",
table = "user_keys", pkColumnName = "PK_NAME", valueColumnName = "PK_VALUE")
@Column(name = "USER_ID")
private long userId;
将策略设置为
@GeneratedValue(strategy = GenerationType.IDENTITY)
。
原始问题得到解决,因为随后Hibernate停止了查找序列表。
答案 8 :(得分:2)
以防万一有人像今天这样把头发拉出来,直到我改了,我才能解决这个错误
spring.jpa.hibernate.dll-auto=create
到
spring.jpa.properties.hibernate.hbm2ddl.auto=create
答案 9 :(得分:0)
这可能是由HHH-10876导致修复的,因此请务必更新为:
答案 10 :(得分:0)
我在postgres中添加了Hibernate序列。 在PostGres编辑器中运行此查询:
CREATE SEQUENCE hibernate_sequence
INCREMENT 1
MINVALUE 1
MAXVALUE 9223372036854775807
START 2
CACHE 1;
ALTER TABLE hibernate_sequence
OWNER TO postgres;
我会找出使用查询的优点/缺点,但对于需要帮助的人可以使用此功能。
答案 11 :(得分:0)
您还可以输入:
@GeneratedValue(strategy = GenerationType.IDENTITY)
让DateBase管理主键的增量:
AUTO_INCREMENT PRIMARY KEY
以上答案对我有帮助。
答案 12 :(得分:0)
就我而言,用.columns{
content: "";
display: table;
clear: both;
width: auto;
margin:0;
padding: 0;
替换所有注释GenerationType.AUTO
解决了这个问题。
答案 13 :(得分:0)
如果您使用的是Hibernate5之前的Hibernate版本,@GeneratedValue(strategy = GenerationType.IDENTITY)
就像一个超级按钮。但是发布Hibernate5之后,必须进行以下修复。
@Id
@GeneratedValue(strategy= GenerationType.AUTO,generator="native")
@GenericGenerator(name = "native",strategy = "native")
private Long id;
DDL
`id` BIGINT(20) NOT NULL AUTO_INCREMENT PRIMARY KEY
原因
当前,如果hibernate.id.new_generator_mappings设置为false, @GeneratedValue(strategy = GenerationType.AUTO)映射到本机。 如果此属性为true(这是5.x中的defult值),则 @GeneratedValue(strategy = GenerationType.AUTO)始终映射到 SequenceStyleGenerator。
因此,在任何不支持序列的数据库上 本机(例如MySQL),我们将改为使用TABLE生成器 身份。
但是,TABLE生成器虽然更便于移植,但使用了单独的 每次从数据库中获取值时进行事务处理。在 实际上,即使IDENTITY禁用JDBC批处理更新和TABLE, 生成器使用池优化器,IDENTITY的伸缩性仍然更好。
答案 14 :(得分:0)
第一步:进入application.properties
spring.jpa.properties.hibernate.id.new_generator_mappings=false
第 2 步:确保主键列应该是自动增量类型
ALTER TABLE EMPLOYEES MODIFY COLUMN ID INT AUTO_INCREMENT;
答案 15 :(得分:-1)
运行此查询
创建序列hibernate_sequence以1递增1开始