Ajuda no Hibernate com Annotations!

Ola Pessoal estou com alguns problemas com Hibernate Annotations

Tenho as seguintes tabelas do banco:

Tabela Pessoa
campos:
id (integer,auto Increment)//chave primária
nome (varchar(45))
telefone (varchar(45))

Tabela Endereco
campos:
pessoa (integer,auto Increment) //chave primária e estrangeira que veio da tabela pessoa
rua (varchar(45))
bairro (varchar(45))
numero (integer)

Tenho as seguintes classes:

Classe Pessoa:

@Entity
public class Pessoa
{
	private Integer id;
	private String nome;
	private String telefone;
	private Endereco endereco;

	public Pessoa()
	{
	}

	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	public Integer getId()
	{
		return id;
	}

	public void setId(Integer id)
	{
		this.id = id;
	}

	@Column
	public String getNome()
	{
		return nome;
	}

	public void setNome(String nome)
	{
		this.nome = nome;
	}

	@Column
	public String getTelefone()
	{
		return telefone;
	}

	public void setTelefone(String telefone)
	{
		this.telefone = telefone;
	}

	public void setEndereco(Endereco endereco)
	{
		this.endereco = endereco;
	}

	@OneToOne(cascade = CascadeType.ALL)
	public Endereco getEndereco()
	{
		return endereco;
	}
}

Classe Endereço:


@Entity
public class Endereco
{
	private Integer id;
	private Pessoa pessoa;
	private String rua;
	private Integer numero;
	private String bairro;

	public Endereco()
	{

	}

	@Id
	@Column(name = "pessoa")
	public Integer getId()
	{
		return id;
	}

	public void setId(Integer id)
	{
		this.id = id;
	}

	@Column
	public String getBairro()
	{
		return bairro;
	}

	public void setBairro(String bairro)
	{
		this.bairro = bairro;
	}

	@Column
	public int getNumero()
	{
		return numero;
	}

	public void setNumero(Integer numero)
	{
		this.numero = numero;
	}

	@Column
	public String getRua()
	{
		return rua;
	}

	public void setRua(String rua)
	{
		this.rua = rua;
	}

	@OneToOne(cascade = CascadeType.ALL)
	public Pessoa getPessoa()
	{
		return pessoa;
	}

	public void setPessoa(Pessoa pessoa)
	{
		this.pessoa = pessoa;
	}
}

Classe de Teste:


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

public class Teste
{
	public static void main(String[] args)
	{
		Session sessao = HibernateFactory.getSession(); // Abrindo uma sessao
		Transaction transaction = sessao.beginTransaction(); // Iniciando uma transacao
		
		Pessoa p1 = new Pessoa();
		p1.setNome("Manuel de Oliveira"); // Preenchendo as propriedades do objeto
		p1.setTelefone("5412158");
		
		
		
		Endereco e1 = new Endereco();
		
		e1.setBairro("Centro");
		e1.setRua("Martins Francisco");
		e1.setNumero(12);
		
		p1.setEndereco(e1);
		e1.setPessoa(p1);
		
		sessao.save(p1); // Transformando o objeto transiente em um objeto persistente no banco de dados
		
		
		
		transaction.commit(); // Finalizando a transacao
		sessao.close(); // Fechando a sessa
		
	}
}

O arquivo hibernate.properties:


hibernate.dialect = org.hibernate.dialect.MySQLDialect
hibernate.connection.driver_class = com.mysql.jdbc.Driver
hibernate.connection.url = jdbc:mysql://localhost/Banco
hibernate.connection.username = root
hibernate.connection.password = minha_senha

Estou usando o Hibernate 3.2 com o Hibernate Annotations, eclipse 3.2, MySQL 5, tudo no Ubuntu 6.06. Acontece o seguitente erro:

“ids for this class must be manually assigned before calling save(): Endereco”

se eu apenas savar o objeto pessoa (retirando o relacionamento entre a classe Pessoa e Endereco), funciona sem erro…

O hibernate não “cascateia” automaticamente o id atribuído à pessoa pro seu endereço. Experimenta tirar o cascade = CascadeType.ALL, salvar a Pessoa, setar o id da pessoa no endereço, e então salvar o endereço.

eu fiz assim e deu certo…


@Entity
@Table(name = "Pessoa", catalog = "Banco", uniqueConstraints = {})
public class Pessoa implements Serializable
{

	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column(unique = true, nullable = false)
	private int id;

	// nao pode ser null tamanho
	@Column(nullable = false, length = 45)
	private String nome;

	// / pode ser null pode inserir pode atualizar tamanho
	@Column(nullable = true, insertable = true, updatable = true, length = 45)
	private String telefone;

	@OneToOne(cascade = { CascadeType.ALL }, fetch = FetchType.LAZY)
	@PrimaryKeyJoinColumn
	private Endereco endereco;

e


@Entity
@Table(name = "Endereco", catalog = "Banco", uniqueConstraints = {})
public class Endereco implements Serializable
{
	static final long serialVersionUID = 1L;

	@Id
	@Column(name = "Pessoa_id", unique = true, nullable = false)
	private int pessoaId;

	@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "endereco")
	//@PrimaryKeyJoinColumn
	private Pessoa pessoa;

	@Column(nullable = false, length = 100)
	private String rua;

	@Column(nullable = false)
	private Integer numero;

	@Column(nullable = false, length = 40)
	private String bairro;

e funcionou o cascade…

veja…


public class Teste
{
	public static void main(String[] args)
	{
		Session sessao = HibernateFactory.getSession(); // Abrindo uma sessao
		Transaction transaction = sessao.beginTransaction(); // Iniciando uma transacao
		
		Pessoa p1 = new Pessoa();
		p1.setNome("Manuel de Oliveira"); // Preenchendo as propriedades do objeto
		p1.setTelefone("5412158");
		
		sessao.saveOrUpdate(p1);
		
		/*Professor p1 = new Professor();
		p1.setNome("Manuel de Oliveira"); // Preenchendo as propriedades do objeto
		p1.setTelefone("5412158");
		p1.setTitulo("Mestre");*/
		
		sessao.saveOrUpdate(p1);

		Endereco e1 = new Endereco(p1);
		e1.setBairro("Centro");
		e1.setRua("Martins Francisco");
		e1.setNumero(12);			
	
		
		sessao.saveOrUpdate(p1);// Transformando o objeto transiente em um objeto persistente no banco de dados
		//sessao.delete(p1);
		
		transaction.commit(); // Finalizando a transacao
		sessao.close(); // Fechando a sessa
		
	}
}

observe q salvei apenas o objeto p1…

Tambem estou com este problema…

Já configurei o CascadeType.ALL…
Porém ainda não testei o @PrimaryKeyJoinColumn

vou tentar aqui!!!

Nossa… nem reparei… 2006! rsrsrs

Não deu certo!!! continua dando o mesmo erro:

ids for this class must be manually assigned before calling save()