【问题标题】: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) 

错误仍然存​​在。

【问题讨论】:

标签: java spring hibernate


【解决方案1】:

您需要为 Hibernate5.x 设置<property name="hibernate.id.new_generator_mappings">false</property>.. 和link

对于旧版本的休眠 4.x: <prop key="hibernate.id.new_generator_mappings">false</prop>

【讨论】:

【解决方案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;
                      

                      【讨论】:

                        猜你喜欢
                        • 2018-09-28
                        • 2017-03-05
                        • 1970-01-01
                        • 2018-05-15
                        • 2014-11-28
                        • 2014-03-15
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        相关资源
                        最近更新 更多