Hibernate - Relacionamento @OneToOne

7 respostas
L

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

@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

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

@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;
	}

Aqui a classe Teste:

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();
		}

	}

}
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 :!:

7 Respostas

F

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

L

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!

F

nao precisa criar as tabelas… deixa o hibernate criar.

L

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:

L

Baaah,

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

Brigadão mesmo man!

Valeu pela paciência! :smiley:

F

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…

=]

L

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

Criado 8 de fevereiro de 2012
Ultima resposta 8 de fev. de 2012
Respostas 7
Participantes 3