Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Chave composta com hibernate

Pessoal bom dia/tarde/noite/madrugada.

Eu tenho um projeto que consiste num pequeno sistema com estoque e vendas. A venda é baseada num pedido. A respeito do pedido, estou tentando criar uma relação entre os itens do pedido e o pedido de maneira que eu possa consultar os itens informando o pedido e o indice do item no pedido. Eu gostaria de fazer isso utilizando uma chave composta nos itens do pedido, mas não sei criar chave composta no hibernate. Eu cheguei a fazer os cursos de JPA da formação Java mas lá não informa.

2 respostas
solução!

Boa noite Raphael, tudo bem?

Para mapear chaves compostas, você deve criar uma classe que represente a composição de uma chave primária. Por ser uma composição, no seu banco de dados a PK pode ser por exemplo duas colunas do tipo NUMBER, ou uma VARCHAR e outra NUMBER e assim por diante... Ou seja, você precisa representar essa combinação.

Vamos supor que você tenha uma tabela assim:

ITEM_PEDIDO

  • id_pedido NUMBER
  • indice_item NUMBER
  • tipo VARCHAR
  • qtde NUMBER
  • valor_unitario NUMBER

E na tabela ITEM_PEDIDO, a PK é a composição entre id_pedido e indice_item.

Nesse caso, você primeiro tem que criar a classe que represente a PK da tabela ITEM_PEDIDO. Segue exemplo:

import java.io.Serializable;
import javax.persistence.Embeddable;

@Embeddable
public class ItemPedidoID implements Serializable {

    private Long idPedido;
    private Integer indiceItem;

    //construtor default

    //gettes e setters

    //hashcode e equals

}

E na sua classe ItemPedido

import javax.persistence.EmbeddedId;
import javax.persistence.Entity;

@Entity
public class ItemPedido {

    @EmbeddedId
    private ItemPedidoID itemPedidoID;
    private String tipo;
    private BigDecimal qtde;
    private BigDecimal valorUnitario;

    //construtor default

    //getters e setters

}

Daí, via JPQL, você faz:

from ItemPedido ip 
where ip.itemPedidoID.idPedido = :idPedido 
  and ip.itemPedidoID.indiceItem = :indice

Mais detalhes na documentação oficial: https://docs.jboss.org/hibernate/orm/5.4/userguide/html_single/Hibernate_User_Guide.html#identifiers-composite

Abraços!

Oloco! Mais bem explicado que isso só dois disso. Valeu! Eu havia lido algumas coisas sobre @Embeddable, mas não tinha entendido nada. Agora ta tudo certo! Muito obrigado!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software