Novato no hibernate - dúvidas

Boa noite, pessoal. Estou começando os estudos no hibernate.

Minhas tabelas:


Tabela proprietarios:
            nome varchar(20);
            cpf varchar(20); - primary key

Tabela carros:
           idCarro varchar(20) - primary key
           cpf varchar(20) - references proprietarios (cpf) - FK para fazer join com o proprietario
           modelo varchar (20)

Dúvida1:
Eu não ia colocar uma chave primaria em carros, apenas uma chave estrangeira, para que pudesse fazer join com usuarios. Mas nao consegui mapear sem o idCarro. Toda tabela vai necessitar de uma chave primária?

Dúvida2:
Quando criei um usuario e dois carros, passo o objeto usuario para os objetos carros. Os objetos usuarios tem um hashset, com o conjunto de carros. Se eu der um save no usuario, os objetos carros sao salvos na tabela carros?
Exemplo:

   // crio e gravo o usuario no banco
   crio proprietario1;
   session.save(proprietario1)

   //crio dois carros
   crio carro1 (passando como parametro idCarro1, proprietario1, modelo1)
   crio carro2 (passando como parametro idCarro2, proprietario1, modelo2)

   // coloco os carros na lista de carros que o usuario tem. Pensei que dando um "save" no usuario, os carros tb seriam gravados, na tabela de carros (mas isso nao acontece)
   proprietario1.getHashSetCarros().add(carro1)
   proprietario1.getHashSetCarros().add(carro2)

   //aqui sim, os carros sao gravados na tabela.
   session.save(carro1)
   session.save(carro2)

Duvida3:
Eu sei fazer uma query simples, por exemplo, um select * from carros. e pegar todos os carros. Mas como faço algo do tipo:

  select proprietarios.cpf, carros.modelo
  from proprietarios, carros
  where proprietario.cpf = carros.cpf;

Na verdade, seria pegar todos os proprietários que existem e seus respectivos carros. o Relacoinamento é 1xN, pois um proprietario pode ter vários carros e vários carros podem pertencer a uma mesmo proprietario.

Acho que as dúvidas sao bem simples, mas se for necessario enviar o codigo fonte, posso passar num arquivo zip. na verdade, acho que depois que resolver essa, vou ter mais algumas, mas com o tempo, envio por aqui. Li alguns tutoriais, mas sempre surgem algumas duvidas, como a Dúvida2… Desde já, obrigado!

Resposta 1:
Sim, toda classe mapeada vai ter que ter um Identificador, se nao quer se preocupar em gerar um Id você pode usar a anotação @GeneratedValue(strategy = GenerationType.AUTO)
que gera automático para você.

Resposta 2:
Vão sim, se você mapeou corretamente no java os objetos carro na classe usuario, quando voce der um save ele ira adicionar o carro na sua respectiva tabela

Resposta 3:
Não entendi a ‘pergunta’.

Abraçõs e se eu estiver errado me corrijam por favor.

Ola gpmdf2,
bacana estudar Hibernate.
No meu blog fiz alguns posts sobre configuração, mapeamento, etc usando Hibernate, dá uma olhada lá, certamente poderá te ajudar.

Qualquer dúvida, poste aqui!

www.serjava.blogspot.com

[]s

Pessoal, obrigador pela ajuda!

luyz : a Terceira dúvida seria, por exemplo, imaginando que eu tenha 2 proprietarios e cada um tenha 3 carros, como trazer proprietario1, juntos com seus 3 carros e o proprietario2 junto com seus 3 carros. fazer uma query que me traga esses 2 objetos. Imagino que possamos fazer uma query assim, que traz os objetos proprietarios, mais os objetos carros (tudo junto) ou uma que me traga apenas os proprietarios.

Usei o NetBeans. Ele fez os mapeamentos, entao acho que nao ta errado, nao…


fabiomedeirosf : No seu tutorial, você criou da mesma forma que eu, primeiro a entidade Categoria, depois os Produtos que estao dentro da categoria.

Aí salvou a categoria (usando o .save()), depois salvou os produtos. É esse o passo a passo, mesmo?

A minha dúvida é: eu poderia criar o objeto Categoria, NAO DAR O SAVE, criar os dois objetos Produtos, NAO DAR O SAVE e agora, com os 3 objetos criados, como vc deu nos Produtos o set(categoria), eles ja conhecem suas categorias (produto.setCategoria(categoria)). No meu exemplo, a categoria teria também uma lista, que guarda todos os seus produtos. No seu exemplo, nao vi isso. Eu queria saber se, já que eu tenho essa lista e teoricamente entao a categoria sabe quais sao os produtos dela, posso dar o save() APENAS na categoria e automaticamente os produtos ja seriam salvos, entendeu? Porque nos tutoriais que eu vejo, eles fazem assim como fizemos, salvam a entidade “principal”
(categoria) e depois salvam cada uma das entidades “menores”, que seriam os dois produtos.

Por exemplo:

Categoria categoria = new Categoria();
// setar os atributos da categoria, usando seus set()...
// nao salvar ainda

Produto produto = new Produto();
// usar os set para setar suas características, principalmente a sua CATEGORIA
// nao salvar ainda

Produto produto2 = new Produto();
// usar os set para setar suas características, principalmente a sua CATEGORIA
// nao salvar ainda

// no exemplo que to estudando, o Categoria teria um set, que conteria seus produtos. Entao eu poderia adicionar ao objeto Categoria esses dois produtos (colocando-os no set da Categoria)
categoria.getSet().add(produto1);
categoria.getSet().add(produto2);

//agora vem a dúvida: jpa que eu sei que a categoria tem todos os produtos que eu quero que ela tenha no momento, eu posso salvar APENAS o CATEGORIA e os produtos que estao no seu set seriam salvos no banco? 
// Exemplo (situação1):
session.save(categoria); // ja salvaria inclusive os PRODUTOS?????

//ou eu precisaria ainda (situação2): 
session.save(produto1);
session.save(produto2);

Porque pelos tutoriais que eu estou lendo, pelo que eu fiz e pelo que está no seu blog, a situação2 que é feita, sempre. é como se o set fosse apenas uma facilidade, quando eu estiver no nivel de objetos, programando, para que eu posse colocar no objeto categoria seus produtos. Realmente, fica bem melhor assim quando está usando objetos.

Vou continuar lendo teu tutorial, porque mais tarde vou querer saber como se faz relacionamentos nXn e terciarios. Tomara que esteja explicando!

Voce pode adicionar os produtos na categoria:

List<Produto> listaProduto = new ArrayList<Produto>();
listaProduto.add(produto1);
listaProduto.add(produto2);

categoria.setListaProduto(listaProduto);

categoriaDAO.save(categoria);

Talvez seja necessário, na anotação sobre a listaProdutos na entidade Categoria, vc pode colocar o cascade para ALL.

Deverá funcionar como vc quer!

[]s

Fala cara blza?

Resposta 3:
voce tem 2 proprietarios e cada um com 3 carros, voce quer trazer uma Lista de proprietarios com cada proprietario com sua lista de carros certo?
Intao você pode fazer uma HQL(Hibernate Query Language) trazendo uma lista e converte ela para a classe especifica, por exemplo:


List<Proprietario> resposta = new ArrayList<Proprietario>();

resposta = session.createQuery("SELECT p FROM Proprietario as p " + //usando o HQL voce usa o nome da tua classe e nao da tabela do banco OK?
" WHERE p.cpf = :cpf")
.setParameter("cfp", paremetro.cpf)
.list();

Mas para trazer os carros dos proprietarios voce de colocar a anotação @Fetch na lista de carros no objeto do proprietario. intendeu?

Quanto a salvar só o objeto principal esta certo, voce pode salvar só o pai que os filhos no casso os carros, serao salvos tbm, ele salva em cascata, agora para apagar em castaca
voce tem que colocar a anotação na lista que voce quer que ele apague em cascaca blza?por padrão ele jah da insert em cascata.

Espero que tenha ajudado

onde eu devo colocar essa propriedade? Como disse, to usando o “wizard” do net beans. O que chega mais proximo do que vc falou é o seguinte:

To usando os nomes das suas entidades, pra ficar mais facil. Isso seria no get, mesmo? Porque no set o netbeans nao colocou nada. Apenas escreveu o método normalmente, sem anotações.
Enfim, essa minha dúvida é apenas uma curiosidade, o normal é fazer como o seu tutorial, pelo que eu vejo, não é?

Agora notei que no tutorial que eu estava seguindo, ele nao usa o DAO. Pelo que eu lembro, o DAO é um objeto que fica responsavel por gerenciar as gravações de uma forma mais organizada, ne? O tutorial que eu estava seguindo usa a session direto, sem o DAO. Talvez o DAO fosse responsavel por iterar pela lista de produtos. Isso seria uma gambiarra?

Da forma que estou usando, quando salvo, faço o seguinte: session.save(categoria). session.save(produto1); session.save(produto2);

Caso queira (se ficar mais fácil), posso te mandar o projeto, para que você possa ver. Como é uma coisa mínima, realmente o projeto é bem pequeno.

Obrigado pela ajuda!

Pessoal,

Entendi como fazer a query. Obrigado, luyz.

Não vou poder testar agora, porque tenho que viajar e se ficar aqui mais tempo, vou terminar me atrasando. Assim que voltar (segunda-feira), vou testar tudo.

Vou postar aqui as classes (são duas, cada uma com mais ou menos 3 campos, então nada complicado, é só uma basico pra estudo, mesmo). E aí vocês poderiam, por favor, dar uma olhada pra saber se está tudo ok?

Vou mudar o codigo pra ficar em funcao de categoria e produtos e aí conversamos, com o código completo em mãos. Obrigado mesmo pela ajuda de vocês! Até segunda!

Pessoal, boa noite.

Em anexo, envio o projeto. É bem simples, tem apenas duas tabelas, para se fazer relacionamento 1xN, filmes e categoria, onde uma categoria pode conter varios filmes.

O problema que descrevei acontece no projeto, queria que vocês me apontassem o erro. Estou usando o Oracle XE como base de dados. Tô enviando o código não é por preguiça, é que realmente eu nao entendo por que as coisas nao estao funcionando do jeito que eu imaginei, tô quase desistindo de entender. Dando uma olhad ano codigo, espero que voces consigam identificar o problema.

Obrigado pela força!

¬¬"