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

Relacionamento many to many

Estou lendo um livro de java, e no livro vi algo completamente novo, que eu nunca imaginei de ter uma noção de fazer isso, no livro explica um jeito de fazer esse relacionamento, e acredito que seja o correto, por um exemplo.

public class Venda {

@Manytomany    
private List<Produto> produtos;
}

Muitos para muitos, no livro aconselham criam uma tabela tipo que recebem o id do produto e da venda, ficando mais ou menos assim, e com uma anotação chamada. @Embeddable, que significa que ela essa classe não ira ser persistida no banco de dados, será apenas um complemento da outra.

@Embeddable
public class VendaProdutoPK implements Serializable {
    private Integer produtoId;
    private Integer vendaId;

    // HASHCODE E EQUALS.
}

Logo depois criamos a classe do algo como.

public class VendaProduto {
    @EmbeddedId
    private VendaProdutoPk id;
}

Seria algo mais ou menos assim, mais em meus projetos faço algo totalmente diferente, :(, tem algum problema nisso? Ou é bom seguir a forma que eu passei?

6 respostas

Não acho interessante fazer assim não... Você pode até criar a classe VendaProduto, caso precise de informações extras no relacionamento.. por exemplo a data da venda. Só que aí é melhor você relacionar direto com uma venda e um produto, através do ManyToOne.

Então Alberto eu faço mais ou menos do jeito que você me falo, algo como.

@Entity
@SuppressWarnings("serial")
public class Venda implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long codigo;
    private BigDecimal valorTotal = new BigDecimal("0.0");
    @ManyToOne
    @JoinColumn(name = "funcionario_codigo")
    private Funcionario funcionario = new Funcionario();
    @ManyToOne
    @JoinColumn(name = "cliente_codigo")
    private Cliente cliente = new Cliente();
    @ManyToMany
    private List<Produto> produtos = new ArrayList<Produto>();
    private LocalDate data = LocalDate.now(); 
    @ManyToMany(fetch = FetchType.LAZY)
    private List<FormaDePagamento> formaDePagamentos = new ArrayList<FormaDePagamento>();
    @OneToMany(mappedBy = "venda", fetch = FetchType.LAZY)
    private List<Parcela> parcelas = new ArrayList<Parcela>();
    private BigDecimal valorRestante = new BigDecimal("0.0");
    private BigDecimal valorDado = new BigDecimal("0.0");
    private Double valorJuros = 0.0D;
@Entity
@SuppressWarnings("serial")
public class Venda_produto implements Serializable{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long codigo;
    @ManyToOne
    @JoinColumn(name = "Venda_codigo", nullable = false)
    private Venda venda = new Venda();
    @ManyToOne
    @JoinColumn(name = "produtos_codigo", nullable = false)
    private Produto produto = new Produto();
    private Integer quantidade = 0;

Ao contrario eu anoto ela como entidade pq no final eu acabo adicionando ela no meu banco de dados, não sei se esse é jeito certo, mais faço assim. oque que você acha?

Fala Alisson, tudo bem?

Isso funciona para sua lógica? se o resultado esperado está acontecendo, não tem porquê não usar. Mas caso seja apenas uma tabela para fazer o relacionamento entre venda e produto sem nenhuma informação a mais, eu deixaria para a propria JPA criar essa tabela sem ter controle no Java.

Oi Samir, tudo bom e você? Sim está acontecendo como eu queria que acontecesse, entendi então, se você uma tabela sem nenhuma informação poderia deixar apenas ela no meu banco de dados, mais no caso eu uso informação ai por isso que eu criei ela kkk, mais então ta meio que certo Samir? Obrigado me clareou muito, poucas palavras porem efeito muito grande!!

solução!

Fala Alisson!! tudo bem também.

Na minha opinião pessoal, certo e errado são bem relativos. Se está funcionando está certo =). Mas existem boas práticas e questões de performance que não se aplicam nesse caso.

No seu caso, como vc precisa de um atributo a mais para essa relação entre venda e produto está correto fazer essa classe sim.

Novamente muito obrigado Samir. Clareou muito mesmo!