休眠序列不存在
Posted
技术标签:
【中文标题】休眠序列不存在【英文标题】:Hibernate-sequence doesn't exist 【发布时间】:2016-01-03 06:51:36 【问题描述】:我尝试在我的项目中使用 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)
错误仍然存在。
【问题讨论】:
尝试在配置文件中设置 `您需要为 Hibernate5.x 设置<property name="hibernate.id.new_generator_mappings">false</property>
.. 和link。
对于旧版本的休眠 4.x:
<prop key="hibernate.id.new_generator_mappings">false</prop>
【讨论】:
这是在哪里添加的? 将此添加到休眠属性中。 感兴趣的JavaDocs - docs.jboss.org/hibernate/orm/5.1/javadocs/org/hibernate/cfg/… 您的答案可能是问题的解决方案,但它没有解释为什么它解决了问题。请记住,链接往往会失效。【参考方案2】:你也可以放:
@GeneratedValue(strategy = GenerationType.IDENTITY)
并让 DateBase 管理主键的增量:
AUTO_INCREMENT PRIMARY KEY
【讨论】:
这在某些情况下可能很好,但有一个明显的缺点:每个INSERT
都会导致额外的往返数据库来获取 ID。所以当这个缺点是可以接受的时候,很好。
@G.Demecki 您能否讨论一下使用休眠身份生成器与这种往返方法相比的优缺点?真的很有用!【参考方案3】:
仅供参考
如果您使用 hbm 文件来定义 O/R 映射。
注意:
在 Hibernate 5 中,序列名称的参数名称已更改。
以下设置在 Hibernate 4 中运行良好:
<generator class="sequence">
<param name="sequence">xxxxxx_seq</param>
</generator>
但是在Hibernate 5中,同样的映射设置文件会导致“hibernate_sequence doesn't exist”的错误。
要修复此错误,参数名称必须更改为:
<generator class="sequence">
<param name="sequence_name">xxxxxx_seq</param>
</generator>
这个问题浪费了我两三个小时。
不知何故,似乎没有关于它的文档。
我必须阅读 org.hibernate.id.enhanced.SequenceStyleGenerator 的源代码才能弄清楚
【讨论】:
【参考方案4】:这是此错误背后的原因:
它将查找您正在使用的数据库如何生成 ID。对于 MySql 或 HSQSL,存在自动递增的递增字段。在 Postgres 或 Oracle 中,它们使用序列表。由于您没有指定序列表名称,因此它将查找名为 hibernate_sequence 的序列表并将其用作默认值。所以你的数据库中可能没有这样的序列表,现在你得到了那个错误。
【讨论】:
应该被标记为答案,因为这可以简单地解释事情 - 当然应该提到“spring.jpa.properties.hibernate.id.new_generator_mappings=false”的添加,但谢谢。【参考方案5】:我遇到了同样的错误“com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'mylocaldb.hibernate_sequence' doesn't exist”。
使用 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;
它就像魅力一样。
【讨论】:
【参考方案6】:这可能是由已修复的HHH-10876 引起的,因此请确保您更新到:
休眠 ORM 5.2.1, 休眠 ORM 5.1.1, 休眠 ORM 5.0.11【讨论】:
我正在使用 Spring-data-jpa,它在内部使用Hibernate 5.2.17.Final
作为实现。当GenerationType
是AUTO
时,我仍然遇到这个问题。【参考方案7】:
使用 Spring Boot
解决方案
将下面的字符串放在 .application.properties 中
spring.jpa.properties.hibernate.id.new_generator_mappings=false
说明
在 Hibernate 4.X 上,此属性默认为 true
。
【讨论】:
【参考方案8】:我在 postgres 中添加了 Hibernate 序列。 在 PostGres 编辑器中运行此查询:
CREATE SEQUENCE hibernate_sequence
INCREMENT 1
MINVALUE 1
MAXVALUE 9223372036854775807
START 2
CACHE 1;
ALTER TABLE hibernate_sequence
OWNER TO postgres;
我会找出使用查询的优缺点,但需要帮助的人可以使用它。
【讨论】:
【参考方案9】:在 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>
【讨论】:
【参考方案10】:当你使用时
@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 停止寻找序列表。
【讨论】:
【参考方案11】:你也可以放:
@GeneratedValue(strategy = GenerationType.IDENTITY)
并让 DateBase 管理主键的增量:
AUTO_INCREMENT PRIMARY KEY
以上回答对我有帮助。
【讨论】:
【参考方案12】:以防万一有人像我今天一样因这个问题而烦恼,我无法解决这个错误,直到我改变
spring.jpa.hibernate.dll-auto=create
到
spring.jpa.properties.hibernate.hbm2ddl.auto=create
【讨论】:
【参考方案13】:在我的例子中,将所有注释 GenerationType.AUTO
替换为 GenerationType.SEQUENCE
解决了这个问题。
【讨论】:
【参考方案14】:运行这个查询
create sequence hibernate_sequence start with 1 increment by 1
【讨论】:
请您分享它如何解决问题的详细信息,并且您的答案比其他答案更好......【参考方案15】:如果您使用的是 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-issue
目前,如果 hibernate.id.new_generator_mappings 设置为 false, @GeneratedValue(strategy = GenerationType.AUTO) 映射到本机。 如果此属性为真(这是 5.x 中的默认值),则 @GeneratedValue(strategy = GenerationType.AUTO) 始终映射到 序列样式生成器。
因此,在任何不支持序列的数据库上 本机(例如 MySQL)我们将使用 TABLE 生成器 身份。
然而,TABLE 生成器虽然更便携,但使用单独的 每次从数据库中获取值时的事务。在 事实上,即使 IDENTITY 禁用 JDBC 批量更新和 TABLE 生成器使用池化优化器,IDENTITY 仍然可以更好地扩展。
【讨论】:
【参考方案16】:第 1 步:进入 application.properties
spring.jpa.properties.hibernate.id.new_generator_mappings=false
第 2 步:确保主键列应为 auto increment 类型
ALTER TABLE EMPLOYEES MODIFY COLUMN ID INT AUTO_INCREMENT;
【讨论】:
以上是关于休眠序列不存在的主要内容,如果未能解决你的问题,请参考以下文章