休眠序列不存在

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) 

错误仍然存​​在。

【问题讨论】:

尝试在配置文件中设置 `false 见***.com/questions/38815625/… 【参考方案1】:

您需要为 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 作为实现。当GenerationTypeAUTO 时,我仍然遇到这个问题。【参考方案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;

【讨论】:

以上是关于休眠序列不存在的主要内容,如果未能解决你的问题,请参考以下文章

检查特定序列是不是存在于休眠中

休眠表不存在错误

休眠位置参数不存在:查询中的 1

如果不存在,休眠忽略列[关闭]

尽管表上存在行,但休眠查询不返回任何内容

异常 ORA-00942: 表或视图不存在 - 使用休眠会话插入现有表时