Hibernate fazer insert apenas de entidades com informação

8 respostas
M

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.

8 Respostas

Hebert_Coelho

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

AdrianoSB

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

M

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

if(comando X) {
abre conexão;

tracker.set(..);
...

fecha conexã;
}

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.

M

da uma olhada no Cógido.

// 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();

	}
AdrianoSB

Uma correção:

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

Faz um teste.

M

Mudei aqui, nada feito… mesmo problema. :?

AdrianoSB

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.

M

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...
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();
                          }
                 }

persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
	version="1.0">

	<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>
</persistence>
Criado 10 de janeiro de 2013
Ultima resposta 21 de jan. de 2013
Respostas 8
Participantes 3