Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
1
respuesta

[Bug] La base de datos no guarda

Intenté poner los archivos del LoadRecords y los txt del github en mi proyecto, pero a la hora que corro el programa me salta la siguiente excepción:

Exception in thread "main" javax.persistence.NoResultException: No entity found for query at org.hibernate.query.internal.AbstractProducedQuery.getSingleResult(AbstractProducedQuery.java:1667) at com.latam.alura.tienda.dao.CategoriaDao.consultaPorNombre(CategoriaDao.java:30) at com.latam.alura.tienda.prueba.LoadRecords.loadProducto(LoadRecords.java:59) at com.latam.alura.tienda.prueba.LoadRecords.cargarRegistros(LoadRecords.java:33) at com.latam.alura.tienda.prueba.PruebaDeDesempenho.main(PruebaDeDesempenho.java:12)

Revisando, me dí cuenta que el programa no guarda ningún registro en la base de datos, no entiendo lo que esté pasando puesto que los módulos de registro de producto y registro de pedido funcionan y guardan todo correctamente. Este es el código del archivo que ingresé a mi proyecto:

LoadRecords.java:

public class LoadRecords {
    public static void cargarRegistros() throws FileNotFoundException {
        EntityManager em = JPAUtils.getEntityManager();
        CategoriaDao categoriaDao = new CategoriaDao(em);
        ProductoDao productoDao = new ProductoDao(em);
        ClienteDao clienteDao = new ClienteDao(em);
        PedidoDao pedidoDao = new PedidoDao(em);
        em.getTransaction().begin();

        loadCategoria("categoria",categoriaDao,em);

        loadProducto("producto",productoDao,categoriaDao,em);

        loadCliente("cliente",clienteDao,em);

        List<Cliente> clientesList = clienteDao.consultarTodos();
        List<Pedido> pedidoList= new ArrayList<>();

        for(Cliente cl:clientesList) {
            pedidoList.add(new Pedido(cl));
        }

        for(int i=0;i<pedidoList.size();i++) {
            pedidoList.get(i).agregarItems(new ItemsPedido(i+1,productoDao.consultaPorId((long) (i+1)),pedidoList.get(i)));
            pedidoDao.guardar(pedidoList.get(i));
        }

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

    }

    private static void loadProducto(String type, ProductoDao productoDao,CategoriaDao categoriaDao, EntityManager em) throws FileNotFoundException {
        List<String> productosTxt =readFile(type);
        for(int i=0;i<productosTxt.size();i++) {
            String[] line = productosTxt.get(i).split(";");
            if(line.length>1) {
                Categoria categoria=categoriaDao.consultaPorNombre(line[3]);
                Producto producto = new Producto(line[4],line[0],new BigDecimal(line[1]),categoria);
                productoDao.guardar(producto);
                em.flush();
            }
        }
    }

    private static void loadCategoria(String type, CategoriaDao categoriaDao,EntityManager em) throws FileNotFoundException {
        List<String> categoriasTxt =readFile(type);        
        for(int i=0;i<categoriasTxt.size();i++) {
            String[] line = categoriasTxt.get(i).split(";");
            if(line.length==1) {
                Categoria categoria = new Categoria(categoriasTxt.get(i));
                System.out.println(categoria.getNombre());
                categoriaDao.guardar(categoria);
                em.flush();    
            }
        }
    }

    private static void loadCliente(String type, ClienteDao clienteDao,EntityManager em) throws FileNotFoundException {
        List<String> clientesTxt =readFile(type);        
        for(int i=0;i<clientesTxt.size();i++) {
            String[] line = clientesTxt.get(i).split("~");
            System.out.println(line[0]+line[1]);
            if(line.length>1) {
                Cliente cliente= new Cliente(line[0],line[1]);
                clienteDao.guardar(cliente);
                em.flush();    
            }
        }
    }

    private static List<String> readFile(String type) throws FileNotFoundException {
        File file = new File("F:\\Escuela\\OracleONE\\Java y JPA\\JPA-con-hibernate-Alura--stage-final\\tienda\\src\\main\\resources\\utils\\"+type+".txt");
        Scanner scan = new Scanner(file);
        List<String> pedido= new ArrayList<>();
        while(scan.hasNextLine()){
            pedido.add(scan.nextLine());
        }
        scan.close();
        return pedido;
    }


}

Y éste el código de la clase PruebaDeDesempenho:

public class PruebaDeDesempenho {

    public static void main(String[] args) throws FileNotFoundException {
        LoadRecords.cargarRegistros();

        EntityManager em=JPAUtils.getEntityManager();

        Pedido pedido = em.find(Pedido.class, 3l);
        System.out.println(pedido.getFecha());
    }

}

Espero que alguien pueda ayudarme

1 respuesta

¡Hola Estudiante!

La excepción que estás recibiendo "No entity found for query" indica que no se encontró ninguna entidad para la consulta realizada. Esto podría deberse a que no se están guardando los registros en la base de datos.

Revisando el código que compartiste, noto que en el método "loadProducto" se está guardando el producto en la base de datos, pero no se está haciendo un "flush" de la transacción hasta que se hayan guardado todos los productos. Esto podría estar causando que los productos no se estén guardando correctamente en la base de datos.

Para solucionar esto, te sugiero que agregues un "flush" después de guardar cada producto en el método "loadProducto". De esta manera, se asegurará de que cada producto se guarde correctamente en la base de datos antes de continuar con el siguiente.

Espero que esta sugerencia te ayude a resolver el problema. ¡Buena suerte y buenos estudios!