Hibernate序列不存在

时间:2015-10-06 11:13:41

标签: java spring hibernate

我尝试使用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) 

仍然存在错误。

16 个答案:

答案 0 :(得分:107)

你也可以把:

@GeneratedValue(strategy = GenerationType.IDENTITY)

让DateBase管理主键的增量:

AUTO_INCREMENT PRIMARY KEY

答案 1 :(得分:73)

您需要设置<prop key="hibernate.id.new_generator_mappings">false</prop> ..请参阅linklink

答案 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)

我收到了同样的错误&#34; com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:Table&#39; mylocaldb.hibernate_sequence&#39;不存在&#34;。

使用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导致修复的,因此请务必更新为:

  • Hibernate ORM 5.2.1,
  • Hibernate ORM 5.1.1,
  • Hibernate ORM 5.0.11

答案 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-issue

  

当前,如果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开始