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)