UPDATE se um dado já existir no banco

Fala pessoal, estou tendo um pequeno problema com a persistência de dados usando o hibernate no java, o meu problema é o seguinte: tenho varias threads que ficam esperando por alterações de produtos no banco (É um sistema de vendas integrado a um outro sistema), porém sempre que tenho uma alteração ele tenta criar e não alterar, ai acabo tendo um erro de que não foi possível criar, um detalhe é que uso as mesmas threads para popular o banco com os dados já existentes na retaguarda, segue um print do meu código para persistir os dados

Eu queria saber se tem uma forma de verificar se determinado dado já existe no banco, e se já existir,ao invés de criar ele só dar um update… Desde já agradeço a atenção

Faz uma consulta e decide o fluxo!

boolean existe = //logica de consulta no banco

if (existe) {
    // atualiza
    return;
}

// cadastra

Dessa forma eu não entendi bem como faria, ou se ficaria “performático”, ai acabei usando um try catch. Ficou dessa forma →


private void atualizaEmpresa(Element empresaElementList) {
		EntityManagerFactory emf = Persistence.createEntityManagerFactory("fca");
		EntityManager em = emf.createEntityManager();
		try {
			Empresa empresa = null;
			List<Element> listaEmpresa = empresaElementList.getChildren("Empresa");
			
			int i = 0;
			for (Element elementPac : listaEmpresa) {
				i++;
				barraDeProgresso.setString(
						(i == listaEmpresa.size()) ? "Concluido" : "Carregando Empresas "+i+" de "+listaEmpresa.size());
					if (empresa == null) {
						empresa = new Empresa();
						empresa.setEmpCod(1);
						}
					empresa.setBairro(elementPac.getChildText("EmpresaBairro"));
					empresa.setCep(elementPac.getChildText("EmpresaCep"));
					empresa.setChave(elementPac.getChildText("EmpresaChave"));
					empresa.setCnpj(elementPac.getChildText("EmpresaCnpj"));
					empresa.setEndereco(elementPac.getChildText("EmpresaEndereco"));
					empresa.setInscEstadual(elementPac.getChildText("EmpresaInscEstadual"));
					empresa.setInscMunicipal(elementPac.getChildText("EmpresaInscMunicipal"));
					empresa.setMunCod(Integer.parseInt(elementPac.getChildText("EmpresaMunicipio")));
					empresa.setNomeFantasia(elementPac.getChildText("EmpresaNomeFantasia"));
					empresa.setNumero(Integer.parseInt(elementPac.getChildText("EmpresaNumero")));
					empresa.setRazaoSocial(elementPac.getChildText("EmpresaRazaoSocial"));
					empresa.setEmpCodRetaguarda(Integer.parseInt(elementPac.getChildText("EmpCodRetaguarda")));

					em.getTransaction().begin();
					try {
						em.persist(empresa);
						em.getTransaction().commit();
					} catch (RollbackException e) {
						em.find(empresa.getClass(), Integer.parseInt(elementPac.getChildText("EmpCodRetaguarda")));
						em.merge(empresa);
						em.getTransaction().commit();
					}
				}
			} catch (DAOException e) {
	
			}finally {			
				em.close();
				emf.close();
				emf = null;
				em = null;
			}
	}

De certa forma foi exatamente na mesma linha do que eu disse, só que ao invés de fazer a lógica por if/else está aplicando por try/catch.

Ambos formatos executam o mesmo número de operações, logo, a performance é a mesma.

1 curtida

Sim, o importante mesmo é funcionar kkkkk, Obrigado pela ajuda!

Pelo que pude entender, outra forma de realizar, é fazer um select no banco, se retornar dados realiza um update se não retornar nada faz o insert, pelo que pude estar observando do código, acredito que desta forma ele ficaria um pouco mais limpo. No entanto apenas testando para saber

1 curtida