Erro no uso do Hibernate

1 resposta
R

Estou fazendo um dos exemplos que encontrei aqui no forum porém esta dando um erro que não estou conseguindo resolver. Na situação abaixo estou tentando incluir uma Pessoa e seu endereço, porém está dando erro. A tabela Pessoa tem relacionamento 1:1 com a tabela endereço, onde a tabela endereço tem a chave estrangeira Pessoa_id da tabela pessoa como chave primaria. Não sei fui muito claro, mas seguem os códigos e o erro.

Classe Pessoa

package classes;

public class Pessoa {
	
	private Integer id;
	private String nome;
	private String email;
	private String telefone;
	private Endereco endereco;
	
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public String getTelefone() {
		return telefone;
	}
	public void setTelefone(String telefone) {
		this.telefone = telefone;
	}
	public Endereco getEndereco() {
		return endereco;
	}
	public void setEndereco(Endereco endereco) {
		this.endereco = endereco;
	}
	
	@Override
	public String toString() {
		return String.format(
				"Contato: %s - %s - (%s)", nome, email, telefone);
	}
}

Classe Endereco

package classes;

public class Endereco {
	private String logradouro;
	private String numero;
	private String bairro;
	private String cidade;
	private String complemento;
	private String estado;
	private String cep;
	private Integer id;
	private Pessoa pessoa;
	
	
		
	public Pessoa getPessoa() {
		return pessoa;
	}
	public void setPessoa(Pessoa pessoa) {
		this.pessoa = pessoa;
	}
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getLogradouro() {
		return logradouro;
	}
	public void setLogradouro(String logradouro) {
		this.logradouro = logradouro;
	}
	public String getNumero() {
		return numero;
	}
	public void setNumero(String numero) {
		this.numero = numero;
	}
	public String getBairro() {
		return bairro;
	}
	public void setBairro(String bairro) {
		this.bairro = bairro;
	}
	public String getCidade() {
		return cidade;
	}
	public void setCidade(String cidade) {
		this.cidade = cidade;
	}
	public String getComplemento() {
		return complemento;
	}
	public void setComplemento(String complemento) {
		this.complemento = complemento;
	}
	public String getEstado() {
		return estado;
	}
	public void setEstado(String estado) {
		this.estado = estado;
	}
	public String getCep() {
		return cep;
	}
	public void setCep(String cep) {
		this.cep = cep;
	}

	
	
}

Mapeamento do Hibernate da classe Pessoa

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                                   "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
 <class name="classes.Pessoa" table="pessoa">
  <id column="Pessoa_id" name="id">
   <generator class="increment"/>
  </id>
  <property name="nome"/>
  <property name="telefone"/>
  <property name="email"/>
  <one-to-one cascade="save-update" class="classes.Endereco" name="endereco"/>
 </class>
</hibernate-mapping>

Mapeamento do Hibernate da classe Endereco

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<class name="classes.Endereco" table = "endereco">
		<id name="id" column="Pessoa_id">
			<generator class="foreign">
				<param name="property">pessoa</param>
			</generator>
		</id>
		<property name="bairro"></property>
		<property name="cidade"></property>
		<property name="complemento"></property>
		<property name="estado"></property>
		<property name="numero"></property>
		<property name="logradouro"></property>
		<property name="cep"></property>

		<one-to-one name="pessoa" class="classes.Pessoa"
			constrained="true"></one-to-one>

	</class>
</hibernate-mapping>

Forma de inserção

package classes;

import org.hibernate.Session;
import org.hibernate.Transaction;

public class TesteAdicionar {
	public TesteAdicionar(){
	
Session sessao = HibernateUtility.getSession();
	Transaction transaction= sessao.beginTransaction();
	
	
	Pessoa pessoa = new Pessoa();
	pessoa.setNome("Aluno 1");
	pessoa.setTelefone("111111111");
	pessoa.setEmail("7777");
	
	Endereco endereco = new Endereco();
	endereco.setLogradouro("Rua 3");
	endereco.setNumero("30");
	endereco.setBairro("Bairro 3");
	endereco.setCidade("Cidade 3");
	endereco.setCep("123456789");
	endereco.setEstado("OO");
	
	pessoa.setEndereco(endereco);
	
	
	sessao.save(pessoa);
	sessao.save(endereco);

	

	
	transaction.commit();
	sessao.close();
}
}

ERRO

[code]
Hibernate: select max(Pessoa_id) from pessoa
Exception in thread "main" org.hibernate.id.IdentifierGenerationException: attempted to assign id from null one-to-one property: pessoa
	at org.hibernate.id.ForeignGenerator.generate(ForeignGenerator.java:68)
	at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:122)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:117)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)
	at org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:535)
	at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:527)
	at org.hibernate.engine.CascadingAction$5.cascade(CascadingAction.java:241)
	at org.hibernate.engine.Cascade.cascadeToOne(Cascade.java:292)
	at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:240)
	at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:193)
	at org.hibernate.engine.Cascade.cascade(Cascade.java:154)
	at org.hibernate.event.def.AbstractSaveEventListener.cascadeAfterSave(AbstractSaveEventListener.java:479)
	at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:357)
	at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:204)
	at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:144)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210)
	at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:56)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195)
	at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:50)
	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)
	at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:563)
	at org.hibernate.impl.SessionImpl.save(SessionImpl.java:551)
	at org.hibernate.impl.SessionImpl.save(SessionImpl.java:547)
	at classes.TesteAdicionar.<init>(TesteAdicionar.java:35)
	at classes.Teste.main(Teste.java:8)

1 Resposta

L

Bom sempre usei annotations mas me parece que falta

endereco.setPessoa(pessoa);
Criado 28 de agosto de 2009
Ultima resposta 29 de ago. de 2009
Respostas 1
Participantes 2