Hibernate fazer insert apenas de entidades com informação

Galera to começando agora com Hibernate… então se eu fala bobagem podem me corrigir :smiley:

Estou recebendo informações de um rastreador… ele pode me enviar N comandos diferentes… e cada comando tem a sua informação.
eu trato ela e gravo em banco…

O problema está quando recebo por exemplo um comando que envia as Coordenadas… blz vou lá trato e gravo…
mas o próximo comando que vier que não tenha coordenada… vai ser salvo no banco com a coordenada do anterior…

o Hibernate armazena os valores anteriores em alguma memoria chache ou algo do tipo ? alguém poderia me explicar ? hehe

teria como configurar ou algum forma de fazer com que o Hibernate só faça o insert das entidades que tenham conteúdo e “ignore” as que são antigas ?

att.

Matheus Nani.

Não seria mais fácil colocar os valores como únicos? Aí se inserir repetido da erro?

Vc não esta gravando a nova informação no objeto com referência anterior?
Quando vc receber as novas informação, de um new no seu objeto, seta os no valores e salve.

Se possível coloque o trecho do código fonte, para facilitar a entendimento e ajuda.


Adriano de Souza Barbosa
http:hpesca.com.br

como uma chave primaria ? se sim… não seira legal… eu posso ter coordenadas iguais… porque recebo a conexão de N rastreadores…e existem comandos que podem enviar o mesmo valor N vezes até que seus status seja alterado…

eu fiz alguns Ifs… mais como o protocolo é de 50 comandos… e pode aumentar e muito… não sei isso pode afetar no desempenho da aplicação passando todas vez por N if’s

por exemplo

[code]if(comando X) {
abre conexão;

tracker.set(…);

fecha conexã;
}[/code]

ele verifica que comando é e faz o tracker.set somente do determinado comando.

isso eu fiz… até funciona mais tem o problema de desempenho…não sei se afetaria muito.

obrigado pela resposta.

da uma olhada no Cógido.

[code]// configuração em MATA-INF / persistence.xml
EntityManagerFactory factory = Persistence
.createEntityManagerFactory(“trackerXXX”);

	EntityManager manager = factory.createEntityManager();

	resptracker tracker = new resptracker();

	tracker.setComando(SplitCobraII.getComando());
	tracker.setImei(SplitCobraII.getImei());
	tracker.setStatus(SplitCobraII.getStatus());
	tracker.setChecksum(SplitCobraII.getChecksum());
	tracker.setEnd(SplitCobraII.getEnd());
            try {

		manager.persist(tracker);
		manager.getTransaction().begin();
		manager.getTransaction().commit();
		System.gc();

	} catch (Exception e) {

		e.fillInStackTrace();

	}

	manager.close();
	factory.close();

}[/code]

Uma correção:

			manager.getTransaction().begin();
			manager.persist(tracker);
			manager.getTransaction().commit();

Faz um teste.

Mudei aqui, nada feito… mesmo problema. :?

Coloca um breakpoint antes do commit e outro depois do commit, compare o que muda nos atributos do objeto tracker, antes de depois do commit.

Galera já tentei isso ai de cima e não vai…será que o erro está na minha configuração ou a forma que estou fazendo a persistência ? vou postar aqui o código… pra vocês darem uma olhada… só explicando o problema novamente…

quero salvar informações em uma tabela X mais nem todas as vezes todas as minhas entidades vão ter informação… por exemplo…

tenho esse comando

Msg:SIGN,Dt:04534684,210113,161407,2609.4317,S,04802.1543,W,0.02,04,08,5E,End

esse comando gravaria…

comando,imei,data,hora,latitude,direçãoLatitude,longitude,direçãoLongitude,velocidade,dadosEntrada,dadosSaida,checksum,fim … funciona BLZ (Y)

agora se eu recebo esse mesmo comando mas dessa forma…

Msg:SIGN,Dt:04534684,04,08,D6,End

não gravaria…

data,hora,latitude,direçãoLatitude,longitude,direçãoLongitude,velocidade

o problema é que quando recebo um comando assim faltando informações ele pega as informações do comando anterior e grava como se fosse dele…

não consigo fazer com que ele “limpasse” as minhas entidades pra que quando chegar um novo comando ele grave oque estiver vazio com “” e o que vier info gravar… alguma idéia ?

Método que faz a persistência…

[code]
public void TrackerAdd() {

                    // configuração em MATA-INF / persistence.xml	

		EntityManagerFactory factory = Persistence.createEntityManagerFactory("trackersite");

		EntityManager manager = factory.createEntityManager();

		manager.getTransaction().begin();
		resptracker tracker = new resptracker();

		tracker.setComando(SplitCobraII.getComando());
		tracker.setImei(SplitCobraII.getImei());
		tracker.setData(SplitCobraII.getData());
		tracker.setHora(SplitCobraII.getHora());
		tracker.setGrauLatitude(SplitCobraII.getGrauLatitude());
		tracker.setGrauLongitude(SplitCobraII.getGrauLongitude());
		tracker.setLatitude(SplitCobraII.getLatitude());
		tracker.setDirecaoLatitude(SplitCobraII.getDirecaoLatitude());
		tracker.setLongitude(SplitCobraII.getLongitude());
		tracker.setDirecaoLongitude(SplitCobraII.getDirecaoLongitude());
		tracker.setCoordenada(Conversor.getCoordinate());
		tracker.setVelocidade(ConversorVelocidade.getGravaSpeed());
		tracker.setDadoEntrada(SplitCobraII.getDadoEntrada());
		tracker.setDadoSaida(SplitCobraII.getDadoSaida());
		tracker.setDataHora(SplitCobraII.getDataTrat());
		tracker.setChecksum(SplitCobraII.getChecksum());
		tracker.setEnd(SplitCobraII.getEnd());

		try {

			manager.persist(tracker);
			manager.getTransaction().commit();

		} catch (Exception e) {

			e.printStackTrace();
			e.fillInStackTrace();

		} finally {

			manager.clear();
			manager.getEntityManagerFactory().getCache().evictAll();
			manager.close();
			factory.getCache().evictAll();
			factory.close();
			System.gc();
                      }
             }
		 [/code]

persistence.xml

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

<persistence-unit name="trackersite" transaction-type="RESOURCE_LOCAL">
	<provider>org.hibernate.ejb.HibernatePersistence</provider>
	<class>Hibernate.resptracker</class>			
	<properties>
		<property name="hibernate.dialect"	value="org.hibernate.dialect.MySQL5InnoDBDialect" />
		<property name="hibernate.hbm2ddl.auto" value="none" />
		<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
		<property name="javax.persistence.jdbc.user" value="*****" />
		<property name="javax.persistence.jdbc.password" value="********" />
		<property name="javax.persistence.jdbc.url"	value="jdbc:mysql://localhost:3306/trackersite" />			
	</properties>
</persistence-unit>

[/code]