La secuencia de hibernación no existe


88

Intenté actualizar hibernate de 4 a 5 en mi proyecto con la 4.2versión de primavera . Después de esta actualización, encontré el siguiente error en mi seguimiento de pila cuando llamé a un método para actualizar.

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 

Cambié el Id incrementado automáticamente con anotación

@GeneratedValue(strategy=GenerationType.AUTO) 

aún el error permanece.


4
intente configurar en el archivo de configuración `<prop key =" hibernate.id.new_generator_mappings "> false </prop>
Eva Mariam

Respuestas:


123

También puedes poner:

@GeneratedValue(strategy = GenerationType.IDENTITY)

Y deje que DateBase gestione el incremento de la clave principal:

AUTO_INCREMENT PRIMARY KEY

13
Esto puede ser bueno en algunos casos, pero tiene un inconveniente obvio: cada INSERTuno provocará un viaje de ida y vuelta adicional a la base de datos para obtener la identificación. Entonces, cuando este inconveniente es aceptable, está bien.
G. Demecki

@ G.Demecki, ¿podría discutir los pros y los contras de usar el generador de identidad de hibernates en contraste con este método de ida y vuelta? ¡Sería realmente útil!
Jordan Mackie

82

Debe configurar Hibernate5.x <property name="hibernate.id.new_generator_mappings">false</property>.. ver y vincular .

Para una versión anterior de hibernate 4.x: <prop key="hibernate.id.new_generator_mappings">false</prop>


¿Dónde se agrega esto?
Samuel Thompson

1
agregue esto en las propiedades de hibernación.
rParvathi


10
Su respuesta puede ser la solución a la pregunta, pero no explica por qué resuelve el problema. Tenga en cuenta que los enlaces tienden a desaparecer.
Clijsters

51

Trabajando con Spring Boot

Solución

Coloque la cadena a continuación en .application.properties

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

Explicación

En Hibernate 4.X, este atributo está predeterminado en true.


30

Esta es la razón detrás de este error:

Buscará cómo la base de datos que está utilizando genera identificadores. Para MySql o HSQSL, hay campos de incremento que se incrementan automáticamente. En Postgres u Oracle, usan tablas de secuencia. Como no especificó un nombre de tabla de secuencia, buscará una tabla de secuencia llamada hibernate_sequence y la usará por defecto. Entonces, probablemente no tenga una tabla de secuencia de este tipo en su base de datos y ahora obtenga ese error.


1
debe marcarse como una respuesta ya que esto explica las cosas de manera simple; por supuesto, debe mencionarse una adición de "spring.jpa.properties.hibernate.id.new_generator_mappings = false" pero gracias.
Nightfury

15

Recibía el mismo error "com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: La tabla 'mylocaldb.hibernate_sequence' no existe".

Usando spring mvc 4.3.7 e hibernate versión 5.2.9, la aplicación se realiza usando una configuración basada en spring java. Ahora tengo que agregar la hibernate.id.new_generator_mappingspropiedad mencionada por @Eva Mariam en mi código así:

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

Y funcionó a las mil maravillas.


14

FYI

Si está utilizando archivos hbm para definir la asignación O / R.

Darse cuenta de:

En Hibernate 5, se ha cambiado el nombre de parámetro para el nombre de la secuencia .

La siguiente configuración funcionó bien en Hibernate 4 :

<generator class="sequence">
    <param name="sequence">xxxxxx_seq</param>
</generator>

Pero en Hibernate 5 , el mismo archivo de configuración de mapeo provocará un error "hibernate_sequence does not exist".

Para corregir este error, el nombre del parámetro debe cambiar a:

<generator class="sequence">
    <param name="sequence_name">xxxxxx_seq</param>
</generator>

Este problema me hizo perder 2, 3 horas.

Y de alguna manera, parece que no hay ningún documento al respecto.

Tengo que leer el código fuente de org.hibernate.id.enhanced.SequenceStyleGenerator para averiguarlo


7

Cuando usas

@GeneratedValue(strategy=GenerationType.AUTO)

o

@GeneratedValue que es una forma abreviada de lo anterior, Hibernate comienza a decidir la mejor estrategia de generación para usted, en este caso ha seleccionado

GenerationType.SEQUENCE como estrategia y por eso se busca

schemaName.hibernate_sequence que es una tabla, para la generación de ID basada en secuencia.

Cuando se utiliza GenerationType.SEQUENCEcomo estrategia, debe proporcionar lo @TableGeneratorsiguiente.

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

Cuando estableces la estrategia,

@GeneratedValue(strategy = GenerationType.IDENTITY) .

El problema original se resuelve porque luego Hibernate deja de buscar la tabla de secuencia.


6

En caso de que alguien se tire de los pelos con este problema como lo hice hoy, no pude resolver este error hasta que cambie

spring.jpa.hibernate.dll-auto=create

a

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

5

en hibernate 5.x, debe agregar set hibernate.id.new_generator_mappings a falso en hibernate.cfg.xml

<session-factory>
    ......
    <property name="show_sql">1</property>
    <property name="hibernate.id.new_generator_mappings">false</property>
     ......
 </session-factory>

2

También puedes poner:

@GeneratedValue(strategy = GenerationType.IDENTITY)

Y deje que DateBase gestione el incremento de la clave principal:

AUTO_INCREMENT PRIMARY KEY

La respuesta anterior me ayudó.


1

Si está utilizando la versión de Hibernate anterior, Hibernate5 @GeneratedValue(strategy = GenerationType.IDENTITY)funciona a la perfección. Pero después de Hibernate5, es necesaria la siguiente solución.

@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

RAZÓN

Extracto de hibernate-issue

Actualmente, si hibernate.id.new_generator_mappings se establece en falso, @GeneratedValue (estrategia = GenerationType.AUTO) se asigna a nativo. Si esta propiedad es verdadera (que es el valor predeterminado en 5.x), el @GeneratedValue (estrategia = GenerationType.AUTO) siempre se asigna a SequenceStyleGenerator.

Por esta razón, en cualquier base de datos que no admita secuencias de forma nativa (por ejemplo, MySQL) usaremos el generador TABLE en lugar de IDENTITY.

Sin embargo, el generador TABLE, aunque es más portátil, utiliza una transacción separada cada vez que se obtiene un valor de la base de datos. De hecho, incluso si IDENTITY deshabilita las actualizaciones por lotes de JDBC y el generador TABLE usa el optimizador agrupado, IDENTITY aún se escala mejor.


0

Esto podría deberse a HHH-10876 que se solucionó, así que asegúrese de actualizar a:

  • Hibernar ORM 5.2.1,
  • Hibernar ORM 5.1.1,
  • Hibernar ORM 5.0.11

1
Estoy usando Spring-data-jpa que internamente se usa Hibernate 5.2.17.Finalcomo implementación. Sigo recibiendo este problema cuando GenerationTypees AUTO.
TheCoder

0

Agregué la secuencia Hibernate en postgres. Ejecute esta consulta en PostGres Editor:

    CREATE SEQUENCE hibernate_sequence
  INCREMENT 1
  MINVALUE 1
  MAXVALUE 9223372036854775807
  START 2
  CACHE 1;
ALTER TABLE hibernate_sequence
  OWNER TO postgres;

Descubriré los pros / contras de usar la consulta, pero alguien que necesite ayuda puede usar esto.


0

En mi caso, reemplazar todas las anotaciones GenerationType.AUTOpor GenerationType.SEQUENCEresolvió el problema.


-2

Ejecuta esta consulta

create sequence hibernate_sequence start with 1 increment by 1

Solicite que comparta los detalles de cómo resuelve el problema y su respuesta es mejor que las otras respuestas ...
Suraj Kumar
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.