Hibernate Chave primaria

3 respostas
S

bom dia galera, seguinte estou tentando inserir um registro usando Hibernate

eu tenho:

Telefone
Pessoa > Que tem um telefone
Usaurio > Que tem uma pessoa,

Usuario tem sua chave estrangeira com Pessoa
porem quando vou inserir o primeiro registro na tabela me lança a seguinte exeção:

11:25:47,125 ERROR AbstractFlushingEventListener:301 - Could not synchronize database state with session
org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
	at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:71)
	at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
	at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:253)
	at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:92)
	at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:87)
	at org.hibernate.jdbc.AbstractBatcher.prepareBatchStatement(AbstractBatcher.java:222)
	at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2224)
	at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2660)
	at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:52)
	at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:248)
	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:232)
	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:139)
	at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
	at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
	at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
	at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
	at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
	at br.inf.bios.entidade.TesteHibernate.main(TesteHibernate.java:58)
Caused by: java.sql.BatchUpdateException: Duplicate key or integrity constraint violation,  message from server: "Cannot add or update a child row: a foreign key constraint fails (`estudos1/usuario`, CONSTRAINT `usuario_ibfk_1` FOREIGN KEY (`pessoa_id`) REFERENCES `pessoa` (`id`))"
	at com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:1461)
	at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48)
	at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:246)
	... 15 more

Eu sei que é por causa da integridade do Banco não existe nenhum registro pra pessoa e tals, como eu resolvo isso, seria algo como.

Session session = factory.openSession();
		
		Transaction trans = session.beginTransaction();
		
		Telefone telefone = new Telefone();
			telefone.setDdd(062);
			telefone.setFone(123456);
		Pessoa pessoa = new Pessoa();
			pessoa.setEmail("[email removido]");
			pessoa.setPrimeironome("TESTE");
			pessoa.setSegundonome("Teste");
			pessoa.setTelefone(telefone);
			
			Usuario usuario = new Usuario();
				usuario.setPessoa(pessoa);
				usuario.setSenha("123456");
				usuario.setDtnascimento(new Date());
			
			session.save(usuario);

help ai galera vlew…

3 Respostas

B

Cara a ideia é mais ou menos isso, mas para isso funcionar, tem que determinas os relacionamentos nas entidades. Vc fez isso ?

Ex:
import javax.persistence.OneToMany;

public class Pessoa {

@OneToMany(cascade=CascadeType.ALL)

private Fone fone;
Seus métodos gets e sets

}

S

??

eu simplesmente gostaria de Definir uma estrategia pra antes de salvar um usuario, inserir primeiro uma Pessoa…

B

Bem, o proprio Hibernate controla isso, desde que vc relacione suas entidades corretamente.

O que vc esta tentando fazer, vai funcionar desde que use as anotações para relacionar suas classes como mostrado em negrito no exemplo que passei.

Depois é so citar as classes conforme vc fez e passar elas no metodo save da session, pois ele mesmo vai reconhecer as dependencias e gravar, mesmo que não esteja cadastrada ainda. Mas tem que mandar para a ele o objeto principal.

EX: Pessoa possui telefone.

Cria o telefone, depois pessoa, joga telefone para pessoa e manda pessoa para o save() de session. o hibernete vai reconhecer que tem um objeto telefone dentro de pessoa e vai salvar.

Criado 13 de agosto de 2007
Ultima resposta 13 de ago. de 2007
Respostas 3
Participantes 2