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

4 respostas
GabrielCardelli

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:

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

}

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

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)
    )

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

é algum problema no mapeamento?

Abraço e obrigado desde já.

4 Respostas

B

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;
GabrielCardelli

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

=/

B

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 …

GabrielCardelli

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.

Criado 4 de junho de 2010
Ultima resposta 4 de jun. de 2010
Respostas 4
Participantes 2