[Duvida] Mapeamento de Classes com Hibernate não me gera Foreign Keys

Opa, pessoal beleza?

Tem um tempo que não faço mapeamento de classes com hibernate.

Hoje fui começar um sistema e quando criei 2 classes:

[code]@Entity
@Table(name=“cidades”)
public class Cidade implements Serializable {

/**
 * 
 */
private static final long serialVersionUID = 1L;

@Id
@GeneratedValue
private Long id;

@Column
private String nome;

@OneToOne(cascade=CascadeType.ALL)
@JoinColumn(name="id",table="estados")
private Estado estado; 

// GETS AND SETS
}[/code]

[code]@Entity
@Table(name=“estados”)
public class Estado implements Serializable {

/**
 * 
 */
private static final long serialVersionUID = 1L;

@Id
@GeneratedValue
private Long id;

@Column
private String nome;

// GETS & SETS

}[/code]

Quando eu rodo minha classe para gerar as tabelas, ele me retorna no console o seguinte:

[code]create table cidades (
id bigint not null auto_increment,
nome varchar(255),
primary key (id)
)

create table estados (
    id bigint not null auto_increment,
    nome varchar(255),
    primary key (id)
)[/code]

Não aparece a coluna em que faço o Join

é algum problema no mapeamento?

Abraço e obrigado desde já.

Vou chutar, mas será que o nome da sua chave primária não está com o mesmo nome da sua chave estrangeira não ???

Na sua entidade Cidade vc pode trocar este mapeamento :


     @OneToOne(cascade=CascadeType.ALL)  
     @JoinColumn(name="id",table="estados")  
     private Estado estado;   
  

Para este:


     @OneToOne(cascade=CascadeType.ALL)  
     @JoinColumn(name="id_estado",table="estados")  
     private Estado estado;   
   

breno mais o JoinColumn name não referência o chave da outra tabela com que quero me relacionar?

se eu mudar pra id_estado deveria mudar o da tabela estado tambem.

Ou estou trocando as bolas?

Coloquei deste modo e me gerou uma exception, estou procurando uma solução mais ainda não encontrei.

Exception:

org.hibernate.AnnotationException: Cannot find the expected secondary table: no estados available for br.edu.automatic.pojo.Cidade

=/

O JoinColumn é um metadado da sua chave estrangeira… Ou seja na sua tabela cidadaes vc deve ter uma coluna com o nome id_estados… E tbm
uma coluna para representar a chave primária dessa tabela, que pode se chamar id mesmo…

Não… Mantenha a tabela estado com uma coluna id para representar sua chave primária…

Tenta tirar este atributo table do @JoinColumn … Deixa só assim:

    @OneToOne(cascade=CascadeType.ALL)    
    @JoinColumn(name="id_estado")    
    private Estado estado;     

Esse atributo não é requerido , seu provedor de persistência vai saber que é para tabela estados pelo tipo do seu objeto, a entidade Estado …

Opa, acho que com essas alterações funcionou pelo menos o campo apareceu. Achei estranho funcionar sem o table e com o table da merda…

Daqui a pouco vou fazer uns testes.

Abraço mano obrigado.