Hibernate - Geração de Tabelas com Foreign Key

3 respostas
mjohnatha

Pessoal, estou com um problema na geração de 2 tabelas de uma aplicação onde estas têm um relacionamento.

O código para geração de tabelas que estou usando é o seguinte:

private void geraTabelas(){
		AnnotationConfiguration cfg = new AnnotationConfiguration();
		cfg.addAnnotatedClass(Fornecedor.class);
		
		SchemaExport se = new SchemaExport(cfg);
		se.create(true, true);
	}

A declaração dos atributos da minha classe Endereco é a seguinte:

@Id
	@GeneratedValue
	@Column(name="id")
	private Integer id;
	
	private String logradouro;
	private String numero;
	private String complemento;
	private String bairro;
	private String cidade;
	private String estado;

Na classe Fornecedor, a declaração é a seguinte:

@Id
	@GeneratedValue
	private Integer id;
	
	@OneToOne
	@JoinColumn(name="id", referencedColumnName="id")
	private Endereco endereco;
	
	private String razaoSocial;
	private String telefone;
	private String cnpj;
	private String email;

Estou rodando o método geraTabelas() primeiro com a classe Endereco e dá tudo certo.
Depois eu rodo com a classe Fornecedor e não dá nenhum erro.
Porém, quando vou checar no banco se as classes foram geradas corretamente, a coluna endereço (que deveria ser foreign key para a tabela endereco) nem sequer foi criada.

Tenho pouca experiência com hibernate.
Alguém sabe me explicar o que é que está acontecendo?

Desde já, agradeço.

3 Respostas

romarcio
@Entity
class MedicalHistory implements Serializable {
    @Id @OneToOne
    @JoinColumn(name = "person_id")
    Person patient;
}

@Entity
public class Person implements Serializable {
    @Id @GeneratedValue Integer id;
}

Ou

@Entity
class MedicalHistory implements Serializable {
    @Id Integer id;
    @MapsId @OneToOne
    @JoinColumn(name = "patient_id")
    Person patient;
}
@Entity
class Person {
    @Id @GeneratedValue Integer id;
}
mjohnatha

Consegui criar as entidades
Mas agora estou com outro problema!

Já consegui inserir um objeto do tipo Endereco mas,
quando tento inserir um objeto do tipo Fornecedor,
está dando o seguinte erro no meu getSession()

private static SessionFactory factory;
	
	public Session getSession(){
		AnnotationConfiguration cfg = new AnnotationConfiguration();
		cfg.addAnnotatedClass(Fornecedor.class);
		factory = cfg.buildSessionFactory();
		return factory.openSession();
	}

O erro está acontecendo, segundo a stack trace, na chamada do buildSessionFactory();

A mensagem de erro informa que a meu atributo endereco referencia uma classe Endereco desconhecida:

Exception in thread "main" org.hibernate.AnnotationException: @OneToOne or @ManyToOne on br.com.unaidea.model.Fornecedor.endereco references an unknown entity: br.com.unaidea.model.Endereco
at org.hibernate.cfg.ToOneFkSecondPass.doSecondPass(ToOneFkSecondPass.java:103)
at org.hibernate.cfg.AnnotationConfiguration.processEndOfQueue(AnnotationConfiguration.java:541)
at org.hibernate.cfg.AnnotationConfiguration.processFkSecondPassInOrder(AnnotationConfiguration.java:523)
at org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:380)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1377)
at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:954)
at br.com.unaidea.persistence.HibernateUtils.getSession(HibernateUtils.java:22)
at br.com.unaidea.persistence.HibernateUtils.main(HibernateUtils.java:74)

Mas estas classes existem e já existem no banco também.

O que pode ser??

romarcio

Você precisa adicionar a classe Endereco:

public Session getSession(){ AnnotationConfiguration cfg = new AnnotationConfiguration(); cfg.addAnnotatedClass(Fornecedor.class); cfg.addAnnotatedClass(Endereco.class); factory = cfg.buildSessionFactory(); return factory.openSession(); }

Todas a classes devem ser adicionadas nas configurações.

Criado 8 de setembro de 2011
Ultima resposta 10 de set. de 2011
Respostas 3
Participantes 2