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.