Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Dúvida] EntityManager não persist meu objeto.

Quando efetuo um teste da Classe TaskTest no console aparece a Query SQL que foi inserido no Banco de Dados. Entretanto, quando roda a aplicação normalmente e insiro um objeto Task via console, não aparece a Query SQL consequentemente não é salvo no Banco de Dados. Classe de Teste:

public class TaskTest {

    private static TaskController taskController;
    private static EntityManager entityManager;
    private static EntityTransaction transaction;

    @BeforeAll
    static void setup(){
        ConnectionUtil connection = new ConnectionUtil();
        entityManager = connection.recoverEntityManager();
        taskController = new TaskController(new TaskService(new TaskDAO(entityManager)));
        transaction = entityManager.getTransaction();
        transaction.begin();
    }

    @AfterAll
    static void teardown(){
        if (transaction.isActive()) {
            transaction.rollback();
        }
        entityManager.close();
    }

    @Test
    @DisplayName("User must be able to create a new task")
    void createNewUserTasks(){
        taskController.createTask("description", "12/09/2025");

        List<TaskEntity> tasks = entityManager.createQuery("SELECT tasks FROM TaskEntity tasks", TaskEntity.class)
                .getResultList();

        assertFalse(tasks.isEmpty());
        tasks.forEach(System.out::println);
    }
    //...

Classe TaskController

public class TaskController implements UITaskInterface {

    private TaskService taskService;

    public TaskController(TaskService taskService) {
        this.taskService = taskService;
    }
    @Override
    public void createTask(String description, String date) {
        LocalDate dueDate = TaskEntity.parseFormat(date);
        TaskEntity myTask = new TaskEntity(description, dueDate);
        taskService.save(myTask);
    }
//...

Class TaskService

public class TaskService implements TaskRepository {

    private DAO taskDAO;

    public TaskService(DAO taskDAO) {
        this.taskDAO = taskDAO;
    }

    @Override
    public void save(TaskEntity object) {
        taskDAO.save(object);
    }
    //...

TaskDAO

public class TaskDAO implements DAO<TaskEntity>{

    private EntityManager entityManager;

    public TaskDAO(EntityManager entityManager){
        this.entityManager = entityManager;
    }

    @Override
    public void save(TaskEntity object) {
        entityManager.persist(object);
    }

Class UI

public class UI {

    private UITaskInterface taskInterface;

    public static Scanner input = new Scanner(System.in);

    public UI(UITaskInterface taskInterface) {
        this.taskInterface = taskInterface;
    }

    public void printDisplay(){
        Integer response = screen();
        System.out.println();
        while (response != 5){
            try{
                switch (response){
                    case 1 :
                        listAllTaskUI();
                        break;
                    case 2 :
                        createTaskUI();
                        break;
                    case 3 :
                        updateTaskUI();
                        break;
                    case 4 :
                        deleteTaskUI();
                        break;
                }
                response = screen();
                System.out.println();
            }catch (Exception e){
                System.out.println("\n"+e.getMessage());
                System.out.println("Pressione \"Enter\" para continuar!\n");
            }
        }
    }

    private Integer screen(){
        System.out.print("""
                     \nTask Manager
                   Escolha uma opção:
                1  - Listar Minhas Tarefas.
                2  - Criar uma Nova Tarefa.
                3  - Atualizar uma nova Tarefa.
                4  - Apagar uma Tarefa.
                5  - SAIR.
                """);
        return input.nextInt();
    }

    private void createTaskUI() {
        input.nextLine();
        System.out.println("Descreva sua Tarefa :");
        String description = input.nextLine();
        System.out.print("Qual a data limite para o término da tarefa" +
                "\nEscreva neste formato 'dd/MM/yyyy': ");
        String dueDate = input.nextLine();
        taskInterface.createTask(description, dueDate);
        System.out.println("\nTarefa criada!");
    }

Cenário do Teste Insira aqui a descrição dessa imagem para ajudar na acessibilidadeCenário da aplicação Insira aqui a descrição dessa imagem para ajudar na acessibilidade

1 resposta
solução!

Olá, Pedro

Pelo que pude observar no seu código, parece que o problema está relacionado com a gestão da transação. No seu teste, você inicia a transação no método setup() e faz o rollback no método teardown(). Isso garante que a transação esteja ativa durante a execução do teste, permitindo que o EntityManager persista o objeto no banco de dados.

No entanto, na sua aplicação, não vejo onde a transação é iniciada e encerrada. O método persist() do EntityManager apenas adiciona a entidade ao contexto de persistência, mas a entidade só é realmente enviada para o banco de dados quando a transação é confirmada.

Portanto, você precisa garantir que a transação esteja ativa quando chamar o método persist(). Uma maneira de fazer isso é iniciar a transação antes de chamar o método persist() e confirmá-la logo depois. Aqui está um exemplo de como você pode fazer isso na sua classe TaskDAO:

@Override
public void save(TaskEntity object) {
    EntityTransaction transaction = entityManager.getTransaction();
    transaction.begin();
    entityManager.persist(object);
    transaction.commit();
}

Lembre-se de que você também deve lidar com possíveis exceções e fazer o rollback da transação em caso de falha.

Espero ter ajudado e bons estudos!