Como fazer One-to-Many no hibernate?

9 respostas
ThiagoWorldCoder

Eu estava seguindo um exemplo de um livro sobre o hibernate e lá estava explicando sobre associação para a própria classe, ou seja, um pai pode ter vários filhos. o mapeamento dele estava assim:

<class name="Category" table="CATEGORY">
   ...
   <property name="name" column="CATEGORY_NAME" />
   <many-to-one name="parentCategory" class="Category" column="PARENT_CATEGORY_ID" cascace="none" />
   <set name="childCategories" table="CATEGORY" cascade="save-update" inverse="true">
      <key column="PARENT_CATEGORY_ID" />
      <one-to-many class="Category" />
   </set>
   ...
</class>

porém, eu queria fazer com que um pedido tivesse vários itens, e a chave extrangeira estaria na tabela de pedido. Ou seja, seria One-to-many, com esse mapeamento eu não consegui entender…

lá na hora de inserir ele estava fazendo assim:

Session session = sessions.openSession();
   Transaction t = session.beginTransaction();
   Category computer = (Category) session.get(Category.class, computerId);
   Category laptops = new Category("Laptops");
   computer.getChildCategories().add(laptops);
   laptops.setParentCategory(computer);
   tx.commit();
   session.close();

Alguém pode me dar um exemplo melhor, ou me explicar esse?

Grato!

9 Respostas

Gobain

Olha os 2 lados de uma relação 1:N

&lt;class name="mdl.comuns.Estados" table="estados" discriminator-value="E"&gt;
        &lt;id name="cod_estado" column="cod_estado" type="java.lang.Integer" unsaved-value="0"&gt;
            &lt;generator class="identity" /&gt;
        &lt;/id&gt;
        &lt;property name="nme_estado" column="nme_estado" type="java.lang.String"/&gt;
        &lt;property name="sig_estado" column="sig_estado" type="java.lang.String"/&gt;
        
        &lt;set name="cidades" inverse="false" cascade="all" order-by="cod_estado" lazy="false"&gt;
            &lt;key column="cod_estado"/&gt;
            &lt;one-to-many class="mdl.comuns.Cidades"/&gt;
        &lt;/set&gt;
        
        &lt;many-to-one name="pais" class="mdl.comuns.Paises" column="cod_pais" not-null="true" lazy="false"/&gt;
    &lt;/class&gt;
&lt;class name="mdl.comuns.Cidades" table="cidades" discriminator-value="CD" lazy="false"&gt;
        &lt;id name="cod_cidade" column="cod_cidade" type="java.lang.Integer" unsaved-value="0"&gt;
            &lt;generator class="identity" /&gt;
        &lt;/id&gt;
        &lt;property name="nme_cidade" column="nme_cidade" type="java.lang.String"/&gt;
        
        &lt;many-to-one name="estado" class="mdl.comuns.Estados" column="cod_estado" not-null="true" lazy="false"/&gt;
    &lt;/class&gt;
ThiagoWorldCoder

Isso aí eu consegui entender, muito obrigado!! Mas como ficaria o meu Set cidades no classe?

private Set pedidos = new HashSet();

public Set getPedidos() {

return pedidos;

}

public void setPedidos(Set pedidos) {

this.pedidos = pedidos;

}

public void addPedidos(Pedido pedido){

pedido.setPedidoItem(this);

pedidos.add(pedido);

}

public Long getIdPedidoItem() {

return idPedidoItem;

}
ThiagoWorldCoder

E como seria uma inserção?

Gobain

No meu caso, como eu já tenho os Estados salvos, eu carrego o Estado que a cidade faz parte, daí na cidade faço

cidade.setEstado(estado);
sessao.save(cidade);

Isso resolve já

ps.: Não crie mais de um tópico sobre a sua dúvida… mantenha em um só e acompanhe-o… não seja deselegante :smiley:

ThiagoWorldCoder

Desculpe o mau jeito de ter postado outra pergunta, é que eu achei que ninguém ia responder novamente essa minha dúvida.

O mapeamento eu fiz do jeito que você falou, mas eu não entendi como seria feita a inserção.
por exemplo lá no banco deveria ter registrado o mesmo estado duas vezes com o mesmo id mas, cada um apontando para uma cidade diferente não é assim?

como eu escreveria uma inserção, quando eu fosse salvar um estado e logo em seguinda duas cidades pra esse estado?
eu estou procurando eu todos os lugares, sempre mostram o mapeamento como é feito e não mostram a inserção direito como seria!!
por favor me ajudem!! Eu não sei mais o que fazer…

grato pela atenção!

Gobain

Quem contém a chave estrangeira é a cidade, e não o estado. Não é o estado q faz parte da cidade, e sim o contrário. Com isso eu parto de um princípio que temos um número fixo de estados no país (lógico não?), e não vamos alterá-los o tempo todo ou gravar novos estados constantemente, certo? Então para gravar uma nova cidade, eu faço assim:

sessao.beginTransaction();

/* Aqui eu carrego o estado em q a cidade vai ser inserida */
Estados estado = (Estados)sessao.load(Estados.class, new Integer(cod_estado));

/* Crio a nova cidade e adiciono o estado a ela */
Cidades cidade = new Cidades(nme_cidade);
cidade.setEstado(estado);
                
/* Salvo a cidade e finalizo a transação */
sessao.save(cidade);
sessao.getTransaction().commit();

Tae… é assim q faço qd preciso gravar uma nova cidade. Mas mesmo assim, se vc for salvar um novo estado, pode ser feito assim:

sessao.beginTransaction();

/* Aqui eu crio e salvo o novo estado */
Estados estado = new Estado(nme_estado, sig_estado);
sessao.save(estado);

/* Crio uma cidade e adiciono o estado a ela */
Cidades jacupiranga = new Cidades(nme_cidade);
jacupiranga.setEstado(estado);

/* Crio outra cidade e adiciono o estado a ela */
Cidades paraisopolis = new Cidades(nme_cidade);
paraisopolis.setEstado(estado);
                
/* Salvo as cidades e finalizo a transação */
sessao.save(jacupiranga);
sessao.save(paraisopolis);
sessao.getTransaction().commit();

Acho q isso da alguma luz, certo?

ThiagoWorldCoder

Valeu pela ajuda, se com essa ajuda eu não conseguir posso parar!!!
brigadão!

Gobain

Opa, tinha um errinho ali q eu vi agora, mas já corrigi… tava sem o save estado :roll:

felipe.sodre

Estou com o mesmo erro, alguem poderia me ajudar?

http://www.guj.com.br/posts/list/0/209148.java

Criado 14 de dezembro de 2007
Ultima resposta 7 de jun. de 2010
Respostas 9
Participantes 3