Hibernate - Relacionamento @OneToOne

Opa, beleza?

Pessoal, estou com um problema que não consegui resolver, procurei aqui mesmo no fórum e também em outros, e nada de dar certo.

O problema é o seguinte, estou fazendo um relacionamento entre duas tabelas, OneToOne, porém não estou obtendo sucesso.

Tendo o script do bd desta maneira:

CREATE TABLE pessoa (
pessoa_id int(11) NOT NULL auto_increment,
pessoa_nome varchar(20) default NULL,
pessoa_idade int(3) default NULL,
PRIMARY KEY (pessoa_id)
);

CREATE TABLE filho (
pessoa_id int(11) default NULL,
filho_nome varchar(20) default NULL,
filho_idade int(3) default NULL,
FOREIGN KEY (pessoa_id) REFERENCES pessoa(pessoa_id),
PRIMARY KEY (pessoa_id)
);

(Imaginando aqui, que uma pessoa só pode ter um filho e um filho só pode der uma pessoa, tipo controle de natalidade rs)
E pelo que entendi a tabela filho não pode ter sua própria primary key por causa do hibernate.

Aqui estão as duas entidades:

Pessoa

[code]@Entity
@Table (name=“pessoa”)
public class Pessoa implements Serializable{
private static final long serialVersionUID = -634150680518715133L;

@Id
@GeneratedValue
@Column (name="pessoa_id")
private int id;

@Column (name="pessoa_nome")
private String nome;

@Column (name="pessoa_idade")
private int idade;

public Pessoa() {
}

public Pessoa (String nome, int idade) {
	this.nome = nome;
	this.idade = idade;
}
    
    // getters and setters

[/code]

Filho
Aqui usei tanto @PrimaryKeyJoinColumn quanto @JoinColum e não funcionou.

[code]@Entity
@Table(name = “filho”)
public class Filho implements Serializable {
private static final long serialVersionUID = 7316391339209722238L;
@Id
@OneToOne
@PrimaryKeyJoinColumn(name = “pessoa_id”) //@JoinColumn(name = “pessoa_id”)
private Pessoa pessoa;

@Column(name = "filho_nome")
private String nome;

@Column(name = "filho_idade")
private int idade;

public Filho() {
}

public Filho(Pessoa pessoa, String nome, int idade, Set<Mae> mae) {
	this.pessoa = pessoa;
	this.nome = nome;
	this.idade = idade;
	this.mae = mae;
}

[/code]

Aqui a classe Teste:

[code]
public class Teste {

private static Session sessao = HibernateUtil.getSessionFactory()
		.openSession();

public static void main(String[] args) {
	Transaction t = sessao.beginTransaction();

	try {			
		Pessoa pessoa = new Pessoa();
		pessoa.setNome("João");
		pessoa.setIdade(49);
		sessao.save(pessoa);
		
		Filho filho = new Filho();
		filho.setPessoa(pessoa);
		filho.setNome("Gabriel");
		filho.setIdade(22);
		sessao.save(filho);	
		
		t.commit();
	} catch (Exception e) {
		t.rollback();
		e.printStackTrace();

	} finally {
		sessao.close();
	}

}

}[/code]

O erro é o seguinte:

Hibernate: insert into pessoa (pessoa_nome, pessoa_idade) values (?, ?) Hibernate: insert into filho (filho_nome, filho_idade, pessoa) values (?, ?, ?) 1877 [main] WARN org.hibernate.util.JDBCExceptionReporter - SQL Error: 1054, SQLState: 42S22 1877 [main] ERROR org.hibernate.util.JDBCExceptionReporter - Unknown column 'pessoa' in 'field list' org.hibernate.exception.SQLGrammarException: Could not execute JDBC batch update

Alguém poderia me ajudar dando uma luz de onde estou cometendo o equivoco?
Valeu galera, desde já obrigado :!:

a classe filho vai precisar de um chave primaria sim… experimente criar a chave primaria separado da chave estrangeira!

Fazendo a modificação, e deixando o script desta forma:

CREATE TABLE pessoa (
pessoa_id int(11) NOT NULL auto_increment,
pessoa_nome varchar(20) default NULL,
pessoa_idade int(3) default NULL,
PRIMARY KEY (pessoa_id)
);

CREATE TABLE filho (
filho_id int(11) NOT NULL auto_increment,
pessoa_id int(11) default NULL,
filho_nome varchar(20) default NULL,
filho_idade int(3) default NULL,
FOREIGN KEY (pessoa_id) REFERENCES pessoa(pessoa_id),
PRIMARY KEY (filho_id)
);

@Entity
@Table(name = "filho")
public class Filho implements Serializable {
	private static final long serialVersionUID = 7316391339209722238L;
	@Id 
	@OneToOne
	@JoinColumn(name = "pessoa_id") //@PrimaryKeyJoinColumn(name = "pessoa_id")
	private Pessoa pessoa;
	
	private int filho_id; //aqui

	@Column(name = "filho_nome")
	private String nome;

	@Column(name = "filho_idade")
	private int idade;

	public Filho() {
	}

	public Filho(Pessoa pessoa, String nome, int idade, Set<Mae> mae) {
		this.pessoa = pessoa;
		this.nome = nome;
		this.idade = idade;
		this.mae = mae;
	}
              // getters and setters

O erro permanece o mesmo :cry:

74144 [main] WARN org.hibernate.util.JDBCExceptionReporter - SQL Error: 1054, SQLState: 42S22 74144 [main] ERROR org.hibernate.util.JDBCExceptionReporter - Unknown column 'pessoa' in 'field list'

mais alguma dica? rs, mas mesmo assim obrigado ae!

nao precisa criar as tabelas… deixa o hibernate criar.

Estou no começo de Hibernate, mas fiz várias relacionamentos, tanto ManyToMany, OneToMany e sempre fui criando o banco pelo MySql.
Fui revendo o código parte a parte com a sugestão que você deu de o filho ter uma primary key, o programa acabou rodando, sem erros.
Porém no MySql o pessoa_id, presente na tabela Filho ficou NULL, não sei mais o que fazer rs.

Mas obrigado pelo ajuda cara :wink:

Baaah,

tu tava certo, deixando o Hibernate criar a tabela deu certinho, rs.

Brigadão mesmo man!

Valeu pela paciência! :smiley:

Eae blz??

Cara tenta fazer esse teste aqui

@Entity   
@Table(name = "filho")   
public class Filho implements Serializable {   
    private static final long serialVersionUID = 7316391339209722238L;   
    
    @Id   
    @GeneratedValue   
    @Column (name="filho_id")   
    private int id; 

    @OneToOne   
    @JoinColumn(name = "pessoa_id") 
    private Pessoa pessoa;   
  
    @Column(name = "filho_nome")   
    private String nome;   
  
    @Column(name = "filho_idade")   
    private int idade;   
  
    public Filho() {   
    }   
  
    public Filho(Pessoa pessoa, String nome, int idade, Set<Mae> mae) {   
        this.pessoa = pessoa;   
        this.nome = nome;   
        this.idade = idade;   
        this.mae = mae;   
    }   
              // getters and setters 

Depois deleta suas tabelas na base de dados e starta sua aplicação… ele tem que criar as tabelas sozinho…

Mas o SCHEMA tem que estar criado…

Ve se funfa…

=]

Fiz desse jeito mesmo, valeu também pela ajuda Furlani :wink: