Java Hibernate Método excluir não está excluindo o objeto

Olá pessoa, estou começando a sair do java básico e indo para um pouquinho do avançado. Estou com dificuldades em excluir um objeto de banco de dados. Consigo salvar o objeto sem problemas, porém não consigo exclui-lo do banco. Aparece a seguinte informação no final da execução: INFO: HHH000114: Handling transient entity in delete processing. Podem me dar um alerta sobre o possível erro ? grato.

Classe repositório

public class RepositorioUsuario implements IUsuarioRepositorio {

	  public void salvar(Usuario usuario) {
		Session sessao = HibernateUtil.getSessionFactory().openSession();
		Transaction transacao = null;
		try {
			transacao = sessao.beginTransaction();
			sessao.save(usuario);
			System.out.println("Usuário salvo com sucesso");
			transacao.commit();
		} catch (RuntimeException e) {
			System.out.println("GerericRepository.salvar" + e.toString());
			// TODO: handle exception
			if (transacao != null)
				transacao.rollback();
			throw e;
		} finally {
			sessao.close();
		}

	}

	public boolean remover(Usuario usuario) {

		Session sessao = HibernateUtil.getSessionFactory().openSession();
		Transaction transacao = null;
		try {
			transacao = sessao.beginTransaction();

			sessao.delete(usuario);
			transacao.commit();

		} catch (RuntimeException e) {
			System.out.println(e.toString());
			// TODO: handle exception
			if (transacao != null)
				transacao.rollback();
			throw e;
		} finally {
			sessao.close();
		}
		return true;

	}

	}

Classe Usuário

@Entity
public class Usuario extends Pessoa {
	private int codigo;

	public Usuario(String nome, String cpf, String telefone, int codigo) {
		super(nome, cpf, telefone);
		this.codigo = codigo;
	}


	public Usuario() {

	}

	@Override
	public boolean equals(Object obj) {
		Usuario usuario = (Usuario) obj;

		if (usuario.getCpf().equals(this.getCpf())) {
			return true;
		}
		return false;

	}

	@Override
	public String toString() {
		return "Usuario" + "Nome: " + getNome() + "CPF: " + getCpf() + "Telefone: " + getTelefone();
	}

Classe Teste

public static void main(String[] args) {

		
		Usuario usuario = new Usuario("José Maria", "12026161458", "998771084", 2);
		
		RepositorioUsuario repositorio = new RepositorioUsuario();
		//repositorio.salvar(usuario);
		repositorio.remover(usuario);


	}

hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

	<session-factory>

		<!-- Configurações de Conexão com o Banco de Dados -->
		<property name="connection.driver_class">com.mysql.cj.jdbc.Driver</property>
		<property name="connection.url">jdbc:mysql://127.0.0.1:3306/locadora?serverTimezone=UTC</property>
		<property name="connection.username">root</property>
		<property name="connection.password">root</property>

		<!-- Pool de Conexões -->
		<property name="connection.pool_size">1</property>

		<!-- SQL dialect -->
		<property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>

		<!-- Gerenciamento do Contexto das Sessões -->
		<property name="current_session_context_class">thread</property>

		<!-- Cache de Segundo Nível -->
		<property name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property>

		<!-- Mostra as SQLs Geradas -->
		<property name="show_sql">true</property>

		<!-- Cria as tabelas do banco de dados
		 <property name="hbm2ddl.auto">create</property>-->
		<!-- Compara a entidade com o que existe no banco de dados validate/update
		<property name="hbm2ddl.auto">update</property>-->
		
		
		 
		
	</session-factory>

</hibernate-configuration>

Quando vc tentou remover, a chamada ao método salvar estava comentado?

Sim, a chamada estava comentada. Outra coisa que esqueci de mencionar, quando a chamada não está comentada ele consegue excluir. Isso está correto ? Pois dessa forma o objeto é excluído no mesmo tempo que é salvo.

Isso que reparei.

Se o salvar estiver comentado, o excluir não vai funcionar mesmo, pois o usuario acabou de ser instanciado (e não vai ter ID preenchido).

Obrigado por tirar a dúvida amigo. Mas tem alguma forma de excluir com a chamada salvar comentada ?

Vc deve recuperar pelo ID (pelo ID ou por qualquer outro criterio) antes, para poder excluir depois.

Primeiro vc salva:

Usuario usuario = new Usuario("José Maria", "12026161458", "998771084", 2);

RepositorioUsuario repositorio = new RepositorioUsuario();
repositorio.salvar(usuario);

Depois vc exclui:

RepositorioUsuario repositorio = new RepositorioUsuario();
Usuario usuario = repositorio.findById(1);
repositorio.remover(usuario);
1 curtida

Essa imagem pode te ajudar a entender os estados de uma entidade no JPA:

  • Quando tu dá um new, é criada uma entidade nova para ser persistida (NEW)
  • Quando tu salva ela no banco, a entidade muda de NEW para MANAGED
  • Você soh consegue remover objetos MANAGED do banco
  • Repare que ao recuperar (retrieve) uma entidade do banco, ela vem como MANAGED
1 curtida