Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Solucionado (ver solución)
Solucionado
(ver solución)
1
respuesta

[Duda] No se vuelve a crear la tabla productos

Hola, me di cuenta que una vez actualizado el código con lo visto en este video este no reconstruye la tabla productos, haciendo que solo intente insertar de nuevo un nuevo producto, quizás por eso el error Incorrect integer value: 'CELULARES' for column 'categoria' at row 1. Asi que elimine la tabla para dejar que el hibernate la creará e insertará nuevos registros por mi.

Lo que quiero saber es porque no me funciono igual que el instructor y porque si lo ejecuto de nuevo lo inserta como un nuevo registro, teniendo así duplicados no por id, les comparto mi codigo:

<?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">
        
        
        <properties>
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/tienda"/>
            <property name="javax.persistence.jdbc.user" value="miUser"/>
            <property name="javax.persistence.jdbc.password" value="miPassword"/>
            
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL8Dialect"/>
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.hbm2ddl.auto" value="update"/>  
        </properties>
            
        </persistence-unit>
</persistence>
@Entity
@Table(name="productos")
public class Producto {
    
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private long id;
    private String nombre;
    private String descripcion;
    private BigDecimal precio;
    private LocalDate fechaDeRegistro = LocalDate.now();
    @Enumerated(EnumType.STRING)
    private Categoria categoria;
    
    
    
    public Producto(String nombre, String descripcion, BigDecimal precio, Categoria categoria) {
        this.nombre = nombre;
        this.descripcion = descripcion;
        this.precio = precio;
        this.categoria = categoria;
    }
    ....
public enum Categoria {
    
    SOFTWARE,
    CELULARES,
    LIBROS,
}
public class RegistroDeProducto {

    public static void main(String[] args) {
        
        Producto celular = new Producto("Samsung", "Telefono usado", new BigDecimal("1000"), Categoria.CELULARES);

        EntityManager em = JPAUtils.getEntityManager();

        ProductoDao productoDao = new ProductoDao(em);

        em.getTransaction().begin();

        productoDao.guardar(celular);

        em.getTransaction().commit();
        em.close();
        
    }

}
public class JPAUtils {

    private static EntityManagerFactory FACTORY = Persistence.createEntityManagerFactory("tienda");
    
    public static EntityManager getEntityManager() {
        return FACTORY.createEntityManager();
    }
}
public class ProductoDao {
    
    private EntityManager em;

    public ProductoDao(EntityManager em) {
        this.em = em;
    }
    
    public void guardar(Producto producto) {
        this.em.persist(producto);
    }
    
    

}
1 respuesta
solución!

Hola Vicente,

Por lo que veo, según tu descripción, parece que Hibernate no está recreando la tabla "productos" después de actualizar tu código, lo que resulta en errores al intentar insertar nuevos productos.

Veo que en tu archivo de configuración de persistencia, tienes la propiedad "hibernate.hbm2ddl.auto" establecida en "update". Esta configuración le dice a Hibernate que solo actualice el esquema de la base de datos, no que lo cree de nuevo desde cero.

<property name="hibernate.hbm2ddl.auto" value="update"/>  

Si quieres que Hibernate cree de nuevo las tablas cada vez que se inicia la aplicación, puedes cambiar el valor de "hibernate.hbm2ddl.auto" a "create" o "create-drop". Sin embargo, ten en cuenta que esto borrará todos los datos existentes en las tablas cada vez que se reinicie la aplicación.

<property name="hibernate.hbm2ddl.auto" value="create"/>  

En cuanto a la inserción de registros duplicados, esto puede deberse a que estás creando nuevos objetos "Producto" con los mismos valores cada vez que ejecutas la aplicación. Aunque los objetos "Producto" tienen diferentes IDs (ya que están generados automáticamente), todos los demás campos son iguales, por lo que parecen duplicados. Para evitar esto, podrías comprobar si un producto con los mismos valores ya existe en la base de datos antes de intentar insertarlo.

Espero que esta información te sea útil. Mucho éxito en todo lo que te propongas y si tienes más duda aquí estaremos para apoyarte.

¡Vamos juntos!

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