Problemas ao salvar

14 respostas
mysql
rafael_moreira1

Bom dia.

O que pode estar causando problemas ao fazer o merge. Os dados não são gravados no banco. mas o objeto vem corretamente ao fazer o merge.

o trecho do código que faz o update é este .

public void guardar(Area area) {
	System.out.println("Area " + area.getDescricao()); // colocado aqui para verificar se o objeto é enviado do bean.
	manager.merge(area);
}

14 Respostas

javaflex

O flush foi chamado ou configurado pra acontecer? O merge em si só atualiza o objeto dentro da sessão do hibernate.

rafael_moreira1

Eu abro e fecho a sessão para todo o programa o flush no manager não é preciso eu acho. segue a parte do codigo que

@Interceptor
@Transactional
public class TransactionInterceptor implements Serializable {

private static final long serialVersionUID = 1L;

private @Inject EntityManager manager;

@AroundInvoke
public Object invoke(InvocationContext context) throws Exception {
	EntityTransaction trx = manager.getTransaction();
	boolean criador = false;

	try {
		if (!trx.isActive()) {
			// truque para fazer rollback no que  passou
			// (senão, um futuro commit, confirmaria até mesmo operações sem transação)
			trx.begin();
			trx.rollback();
			
			// agora sim inicia a transação
			trx.begin();
			
			criador = true;
		}

		return context.proceed();
	} catch (Exception e) {
		if (trx != null && criador) {
			trx.rollback();
		}

		throw e;
	} finally {
		if (trx != null && trx.isActive() && criador) {
			trx.commit();
		}
	}
}

}

@InterceptorBinding

@Retention(RetentionPolicy.RUNTIME)

@Target({ ElementType.TYPE, ElementType.METHOD })

public @interface Transactional {

}

rafael_moreira1

o merge já faz o flush();

javaflex

Se o flush e commit foram feitos, posta o SQL gerado por essa ferramenta pra tentar esclarecer melhor.

rafael_moreira1

este é que é o problema os dados não estão sendo persistidos no banco apesar do flush() e commit.não aparece nem o sql gerado.

javaflex

Mistério, pois após o flush o SQL é gerado e enviado para o banco de dados.

Melhor você fazer um teste isolado do zero, passo a passo, e postar aqui caso ainda tenha dúvida, pois da maneira que postou o código está espalhado e sem ligações, o que dificulta achar o problema.

rafael_moreira1

ok um momento.

rafael_moreira1
public static void main(String[] args) {
	EntityManagerFactory factory = Persistence
			.createEntityManagerFactory("ConfiabilidadePU");
	EntityManager em = factory.createEntityManager();
	EntityTransaction tx = em.getTransaction();
	tx.begin();
	Calendar dataInicial = Calendar.getInstance();

	Calendar dataFinal = Calendar.getInstance();
	dataFinal.add(Calendar.DAY_OF_MONTH, 50);

	
	Endereco endereco = new Endereco();
	endereco.setCep("2223-0061");
	endereco.setComplemento("apartamento 209");
	endereco.setBairro("Rio deJaneiro");
	endereco.setNumero("4000");
	endereco.setUf("RJ");
	endereco.setLogradouro("Rua da Carioca");

	Empresa empresa = new Empresa();
	empresa.setCnpj("92.714.916/0001-21");
	empresa.setIscricaoEstadual("81797013");
	empresa.setNome("GROFFE Metais LTDA");
	empresa.setNomeFantasia("GROFFE");
	empresa.setSegmento("Metalurgia");
	empresa.setDataIni(dataInicial.getTime());
	empresa.setDataFim(dataFinal.getTime());
	empresa.setSponsor("Sponsor Francisco");
	empresa.setEndereco(endereco);
	empresa.setTotalItems(1500);
	em.merge(empresa);

	

	tx.commit();

insert into empresa (ativa, cnpj, data_fim, data_ini, bairro, cep, cidade, complemento, logradouro, numero, uf, iscricao_estadual, nome, nome_fantasia, segmento, sponsor, totalItems) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)

javaflex

Agora que o insert foi gerado, a empresa foi inserida ou retornou algum erro?

rafael_moreira1

foi inserida

javaflex

Então agora é só rever seu código original baseado no que viu funcionando isoladamente.

rafael_moreira1

o que vc quer dizer com isso. fazer desta forma para cada classe.e para cada merge e remove

rafael_moreira1

eu tenho o seguinte codigo que faz o factory do entity manager em todas as classes.

@ApplicationScoped
public class EntityManagerProducer {

private EntityManagerFactory factory;

public EntityManagerProducer() {
	factory = Persistence.createEntityManagerFactory("ConfiabilidadePU");
}

@Produces @RequestScoped
public EntityManager createEntityManager() {
	return factory.createEntityManager();
}

public void closeEntityManager(@Disposes EntityManager manager) {
	manager.close();
}

}

javaflex

Quis dizer que você agora conseguiu produzir um código que funciona salvar no banco, então com essa base você pode prosseguir da maneira que você achar melhor.

Criado 3 de dezembro de 2016
Ultima resposta 3 de dez. de 2016
Respostas 14
Participantes 2