Hibernate序列不存在

rPa*_*thi 82 java spring hibernate

我尝试在Spring项目的项目中将hibernate从4升级到5 4.2.升级完成后,当我调用更新方法时,我在堆栈跟踪中发现以下错误.

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 
Run Code Online (Sandbox Code Playgroud)

我用注释更改了自动递增的Id

@GeneratedValue(strategy=GenerationType.AUTO) 
Run Code Online (Sandbox Code Playgroud)

仍然是错误.

Kik*_*kou 118

你也可以把:

@GeneratedValue(strategy = GenerationType.IDENTITY)
Run Code Online (Sandbox Code Playgroud)

让DateBase管理主键的增量:

AUTO_INCREMENT PRIMARY KEY
Run Code Online (Sandbox Code Playgroud)

  • 在某些情况下这可能会很好,但有一个明显的缺点:每个`INSERT`都会导致一次额外的往返数据库来获取ID.所以当这个缺点可以接受时,很好. (10认同)

rPa*_*thi 77

您需要设置<property name="hibernate.id.new_generator_mappings">false</property>..请参阅链接链接.

  • 您的答案可能是问题的解决方案,但它并不能解释为什么它可以解决问题.请记住,链接往往会死亡. (6认同)

Riv*_*ota 47

使用Spring Boot

将下面的字符串放在.application.properties中

spring.jpa.properties.hibernate.id.new_generator_mappings=false
Run Code Online (Sandbox Code Playgroud)

说明

在Hibernate 4.X上,此属性默认为true.


Vis*_*mar 25

这就是出现此错误的原因:

它将查找您使用的数据库如何生成ID.对于MySql或HSQSL,有增量字段自动递增.在Postgres或Oracle中,它们使用序列表.由于您没有指定序列表名称,因此它将查找名为hibernate_sequence的序列表并将其用作默认值.所以你可能在数据库中没有这样的序列表,现在你得到了那个错误.


Raj*_*han 15

我得到了相同的错误"com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:表'mylocaldb.hibernate_sequence'不存在".

使用spring mvc 4.3.7和hibernate 5.2.9版,应用程序是使用基于spring java的配置.现在我必须hibernate.id.new_generator_mappings在我的代码中添加@Eva Mariam提到的属性,如下所示:

@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;
    }
Run Code Online (Sandbox Code Playgroud)

它就像魅力一样有效.


Li *_*ing 13

FYI

如果您使用hbm文件来定义O/R映射.

请注意:

在Hibernate 5中,序列名称的参数名称已更改.

以下设置在Hibernate 4中运行良好:

<generator class="sequence">
    <param name="sequence">xxxxxx_seq</param>
</generator>
Run Code Online (Sandbox Code Playgroud)

但在休眠5,相同的映射设置文件会导致"hibernate_sequence不存在"的错误.

要修复此错误,参数名称必须更改为:

<generator class="sequence">
    <param name="sequence_name">xxxxxx_seq</param>
</generator>
Run Code Online (Sandbox Code Playgroud)

这个问题浪费了我2,3个小时.

不知何故,看起来没有关于它的文件.

我必须阅读org.hibernate.id.enhanced.SequenceStyleGenerator的源代码来弄清楚它


小智 8

当你使用

@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;
Run Code Online (Sandbox Code Playgroud)

当您将策略设置为

@GeneratedValue(strategy = GenerationType.IDENTITY) .

原来的问题得到解决,因为然后 Hibernate 停止寻找序列表。


JMo*_*ney 7

以防万一有人像我今天一样因为这个问题而把头发拉出来,我无法解决这个错误,直到我改变

spring.jpa.hibernate.dll-auto=create
Run Code Online (Sandbox Code Playgroud)

spring.jpa.properties.hibernate.hbm2ddl.auto=create
Run Code Online (Sandbox Code Playgroud)


小智 5

在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>
Run Code Online (Sandbox Code Playgroud)