休眠序列不存在


88

我尝试使用春季4.2版将项目中的休眠模式从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) 

错误仍然存​​在。


4
尝试在配置文件`<prop key =“ hibernate.id.new_generator_mappings”> false </ prop>中进行设置
Eva Mariam

Answers:


123

您也可以输入:

@GeneratedValue(strategy = GenerationType.IDENTITY)

并让DateBase管理主键的增量:

AUTO_INCREMENT PRIMARY KEY

13
在某些情况下,这可能会很好,但有一个明显的缺点:每次INSERT都会导致一次额外的数据库往返行程以获取ID。因此,当此缺点可接受时,可以。
G. Demecki

@ G.Demecki您可以讨论使用休眠身份生成器与这种往返方法相比的优缺点吗?真的很有用!
乔丹·麦基

82

您需要设置Hibernate5.x <property name="hibernate.id.new_generator_mappings">false</property>..参见并链接

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


在哪里添加?
塞缪尔·汤普森

1
在休眠属性中添加它。
rParvathi


10
您的答案可能是该问题的解决方案,但没有说明为什么它可以解决问题。请记住,链接往往会消失。
Clijsters '18

51

使用Spring Boot

将字符串放在.application.properties中

spring.jpa.properties.hibernate.id.new_generator_mappings=false

说明

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


30

这是导致此错误的原因:

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


1
应该将其标记为答案,因为这可以简单地解释事物-当然应该提到“ spring.jpa.properties.hibernate.id.new_generator_mappings = false”,但谢谢。
nightfury

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;
    }

它像魅力一样运作。


14

费耶

如果使用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的源代码才能弄清楚


7

使用时

@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停止了查找序列表。


6

以防万一有人像我今天一样解决这个问题,直到我改了,我才能解决这个错误

spring.jpa.hibernate.dll-auto=create

spring.jpa.properties.hibernate.hbm2ddl.auto=create

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>

2

您也可以输入:

@GeneratedValue(strategy = GenerationType.IDENTITY)

并让DateBase管理主键的增量:

AUTO_INCREMENT PRIMARY KEY

上面的答案帮助了我。


1

如果您使用的是Hibernate版本,则Hibernate5之前的版本会很有@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.id.new_generator_mappings设置为false,则@GeneratedValue(strategy = GenerationType.AUTO)映射到本机。如果此属性为true(这是5.x中的默认值),则@GeneratedValue(strategy = GenerationType.AUTO)始终映射到SequenceStyleGenerator。

因此,在任何本机不支持序列的数据库(例如MySQL)上,我们将使用TABLE生成器代替IDENTITY。

但是,TABLE生成器虽然更便于移植,但是每次从数据库中获取值时都使用单独的事务。实际上,即使IDENTITY禁用JDBC批处理更新,并且TABLE生成器使用池优化器,IDENTITY的伸缩性仍然更好。



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;

我将找出使用查询的利弊,但对于需要帮助的人可以使用此查询。


0

在我的情况下,更换所有注释GenerationType.AUTO通过GenerationType.SEQUENCE解决问题。


-2

运行此查询

create sequence hibernate_sequence start with 1 increment by 1

要求您分享解决问题的详细信息,您的答案比其他答案还要好...
Suraj Kumar,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.