2
respuestas

tengo un problema con hibernate me sale un error de que el numero de columnas esta incorrecto

Este problema me surgió después de que en intellij vi una forma de conectar la base de datos y desde ahi quise crear la persistencia, ya tenia creada la persistencia incluso no vi que modificara nada de la persistencia, pero al querer hacer modificaciones a la base de datos me salia este error

Exception in thread "main" java.lang.ExceptionInInitializerError
    at RegistroProductos.main(RegistroProductos.java:14)
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: tienda] Unable to build Hibernate SessionFactory
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.persistenceException(EntityManagerFactoryBuilderImpl.java:1597)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1503)
    at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:56)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:79)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:54)
    at com.latam.alura.tienda.utilitis.JPAUtilitis.<clinit>(JPAUtilitis.java:8)
    ... 1 more
Caused by: org.hibernate.MappingException: identifier mapping has wrong number of columns: com.latam.alura.tienda.ProductosEntity type: object
    at org.hibernate.mapping.RootClass.validate(RootClass.java:273)
    at org.hibernate.boot.internal.MetadataImpl.validate(MetadataImpl.java:359)
    at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:314)
    at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:471)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1498)
    ... 5 more

mi archivo persistencia es este, trate de camnbiar a una base de datos mysql pero aun asi no funciono

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.2" xmlns="http://xmlns.jcp.org/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd">
    <persistence-unit name="tienda" transaction-type="RESOURCE_LOCAL">
        <!-- Configuración de la base de datos -->
        <properties>
            <!-- Nombre del controlador de la base de datos (depende del DBMS que estés utilizando) -->
            <property name="javax.persistence.jdbc.driver" value="com.mysql.cj.jdbc.Driver"/>

            <!-- URL de conexión a la base de datos -->
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/tienda?serverTimezone=UTC"/>

            <!-- Usuario y contraseña de la base de datos -->
            <property name="javax.persistence.jdbc.user" value="root"/>
            <property name="javax.persistence.jdbc.password" value="sasa"/>

            <!-- Dialecto de Hibernate (depende del DBMS que estés utilizando) -->
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>


            <!-- Estrategia para la creación de tablas: update, create, create-drop, none, etc. -->
            <property name="hibernate.hbm2ddl.auto" value="update"/>

            <!-- Muestra las sentencias SQL en la consola -->
            <property name="hibernate.show_sql" value="true"/>
        </properties>
    </persistence-unit>
</persistence>

cree otro proyecto donde agrege la base de mysql y ahora me dice

Caused by: java.sql.SQLSyntaxErrorException: Table 'tienda.productos' doesn't exist
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:121)
    at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
    at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:916)
    at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1061)
    at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1009)
    at com.mysql.cj.jdbc.ClientPreparedStatement.executeLargeUpdate(ClientPreparedStatement.java:1320)
    at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdate(ClientPreparedStatement.java:994)
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:197)
    ... 21 more
2 respuestas

Hola José,

Sí, problema con el mapeo de tu entidad ProductosEntity en Hibernate. El error indica que el número de columnas en el mapeo no coincide con el número de columnas en la tabla de la base de datos.

Primero, te sugiero que verifiques la entidad ProductosEntity y te asegures de que los campos y las anotaciones correspondan exactamente a las columnas de tu tabla en la base de datos. Por ejemplo, si tienes un campo en tu entidad que no existe en la tabla de la base de datos, o viceversa, obtendrás este error.

Además, el segundo error que mencionaste indica que la tabla 'tienda.productos' no existe en tu base de datos. Esto puede ser porque la tabla realmente no existe, o porque Hibernate no pudo crearla debido a un error en el mapeo. Te recomendaría que verifiques si la tabla existe en tu base de datos. Si no existe, deberías revisar la configuración de hibernate.hbm2ddl.auto en tu archivo de persistencia. Si está configurado como 'update', Hibernate debería crear automáticamente las tablas que no existen, pero si hay un error en el mapeo, no podrá hacerlo.

El error también podría deberse a problemas en la inicialización de clases o recursos utilizados por tu aplicación. En este caso, parece haber un problema en la clase com.latam.alura.tienda.utilitis.JPAUtilitis en el método estático de inicialización (). Verifica si esta clase está configurada correctamente y si hay errores en la inicialización de recursos o clases en ese método.

Por último, si estás cambiando de base de datos, asegúrate de que el dialecto de Hibernate en tu archivo de persistencia coincide con el de tu base de datos. Por ejemplo, si estás usando MySQL, el dialecto debería ser org.hibernate.dialect.MySQLDialect.

Espero que estas sugerencias te ayuden a solucionar el problema. Mucho éxito en todo lo que te propongas y si tienes alguna duda aquí estaremos para apoyarte.

¡Vamos juntos!

Si este post te ayudó, por favor, marca como solucionado ✓. Continúa con tus estudios

hola muchas gracias