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.

rParvathi
fuente
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
Kikou
fuente
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>

rParvathi
fuente
¿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.

RivanMota
fuente
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.

Vishnu S Kumar
fuente
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.

Rajan Chauhan
fuente
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

Li Ying
fuente
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.

Kalpa
fuente
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
JMoney
fuente
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>
tekintian
fuente
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ó.

Pradeep Singarakannan
fuente
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.

Prasanth Rajendran
fuente
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
Vlad Mihalcea
fuente
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.

Chinmoy
fuente
0

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

wwesantos
fuente
-2

Ejecuta esta consulta

create sequence hibernate_sequence start with 1 increment by 1
usuario2179635
fuente
Solicite que comparta los detalles de cómo resuelve el problema y su respuesta es mejor que las otras respuestas ...
Suraj Kumar