Intenté actualizar hibernate de 4 a 5 en mi proyecto con la 4.2
versió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.
Respuestas:
También puedes poner:
@GeneratedValue(strategy = GenerationType.IDENTITY)
Y deje que DateBase gestione el incremento de la clave principal:
fuente
INSERT
uno 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.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>
fuente
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
.fuente
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.
fuente
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_mappings
propiedad 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.
fuente
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
fuente
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 seleccionadoGenerationType.SEQUENCE
como estrategia y por eso se buscaschemaName.hibernate_sequence
que es una tabla, para la generación de ID basada en secuencia.Cuando se utiliza
GenerationType.SEQUENCE
como estrategia, debe proporcionar lo@TableGenerator
siguiente.@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.
fuente
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
a
fuente
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>
fuente
También puedes poner:
@GeneratedValue(strategy = GenerationType.IDENTITY)
Y deje que DateBase gestione el incremento de la clave principal:
La respuesta anterior me ayudó.
fuente
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
fuente
Esto podría deberse a HHH-10876 que se solucionó, así que asegúrese de actualizar a:
fuente
Hibernate 5.2.17.Final
como implementación. Sigo recibiendo este problema cuandoGenerationType
esAUTO
.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.
fuente
En mi caso, reemplazar todas las anotaciones
GenerationType.AUTO
porGenerationType.SEQUENCE
resolvió el problema.fuente
Ejecuta esta consulta
create sequence hibernate_sequence start with 1 increment by 1
fuente