Hibernate mapeamento objeto-relacional

6 respostas
julianofischer

Olá galera,
minha dúvida é a seguinte,

tenho 2 tabelas que tem um relacionamento one-to-many,
logo, nas tabelas, a tabela do lado do many recebe uma FK da tabela ONE.

Na hora de criar as minhas classes,
devo criar como um "espelho do BD", por exemplo com um atributo "private Integer idDaOutraTabela",
ou devo criar um objeto?

Exemplificando.

Cidadao tem Cidade.
Vários cidadãos pertencem a mesma cidade.

public class Cidadao{
        private Integer id;
        private Integer idCidade;
}

ou

public class Cidadao{
        private Integer id;
        private Cidade cidade;
}

Obrigado!

6 Respostas

sergiolopes

A segunda abordagem, sempre. Com ORM/Hibernate você para de pensar em relacionamentos com chaves e IDs e passa a pensar em relacionamento de objetos. Portanto o correto é ter um atributo Cidade dentro da sua classe Cidadão. O Hibernate cuidará de transformar esse relacionamento de objetos em IDs e chaves estrangeiras no banco de dados.

julianofischer

Obrigado Sérgio!
mais uma pergunta;

Estou usando o netbeans aqui, colocando os annotations nas minhas classes e tem um warning dizendo que eu ainda não tenho uma “unidade de persistência”, pode me dizer o que é isso?
Posso colocar todas as configurações de acesso ao banco de dados no HibernateUtil, certo?

mynameisflaw

O seu Netbeans deve estar achando que seu projeto é um projeto JPA, provavelmente por causa das anotacoes utilizadas do pacote javax.persistence.*. Por isso ele esta te cobrando uma Persistence Unit
As configuracoes de acesso a banco, sugiro mante-las em um arquivo de configuracoes a parte: hibernate.properties

abraços

julianofischer

Outra dúvida,
se eu tenho uma classe Carne e cada carne tem um número maior que zero de parcelas,

public class Carne{
    private Set<Parcela> parcelas;
}

public class CarneDao{
     
    public void salvar1(Carne c){
           //pega session
           session.save(c);
           //commit
    }
    
    public void salvar2(Carne c){
           Iterator it = c.getParcelas().iterator();
           //pega session
           while(it.hasNext()){
               session.save(it.next());
           }
           session.save(c);
           //commit
    }

Qual das 2 abordagens está correta?
A do método salvar1 ou a do método salvar2?
Eu acredito que seja a do método salvar um, porém no meu projeto não funcionou, o que me levou a fazer essa pergunta!
Abraços

mynameisflaw

A abordagem um é a mais apropriada, porém seu mapeamento precisa de um aditivo para funcionar dessa maneira.

A sua coleção de parcelas não é persistida no primeiro caso porque o mapeamento está na outra ponta, e o mappedBy está Carne.
Então quando você salva o objeto Carne, a coleção de parcelas não sabe que o objeto Carne existe.
Faça o seguinte:

public class Carne {
...

public void adicionarParcela(Parcela p) {
  if ( this.parcelas != null && p != null ) {
    p.setCarne(this);
    this.parcelas.add(p);
  }
...
}

Sempre que for adicionar um objeto Parcela à coleção presente em Carne, utilize esse método acima.

Tente persistir novamente o objeto Carne, como você demonstrou no primeiro caso.

Não esqueça de iniciar um escopo transacional ;)

abraços!

julianofischer

Entendi,
mas não tem como resolver esse problema utilizando as Annotations?

Criado 14 de julho de 2010
Ultima resposta 15 de jul. de 2010
Respostas 6
Participantes 3