4
respostas

Deletar cardápio e todos os produtos que estiverem nele

Tenho uma classe Cardápio, e preciso que ao deleta-lo, todos os itens da classe produto que possuam o id desse cardápio sejam deletados também.

Eu preciso usar o Dao do produto aqui dentro?

Meu Dao:

@RequestScoped
public class CardapioDao {

    private EntityManager manager;

    @Inject
    public CardapioDao (EntityManager manager){
        this.manager = manager; 
    }

    public CardapioDao(){}

    public void remove(Cardapio cardapio) {
        manager.getTransaction().begin();
        cardapio = busca(cardapio);
        manager.remove(cardapio);
        manager.getTransaction().commit();
    }

    public Cardapio busca(Cardapio cardapio) {
        return manager.find(Cardapio.class, cardapio.getId());
    }
4 respostas

Fala ai Thiago, para fazer isso você pode configurar o cascadeno próprio banco de dados.

Mas caso queira fazer pela aplicação, você precisa pegar todos os produtos contidos nesse cardápio, fazer um for neles e ir deletando produto por produto.

@RequestScoped
public class CardapioDao {

    private EntityManager manager;

    @Inject
    public CardapioDao (EntityManager manager){
        this.manager = manager; 
    }

    public CardapioDao(){}

    public void remove(Cardapio cardapio) {
        manager.getTransaction().begin();
        cardapio = busca(cardapio);
        manager.remove(cardapio);
    // aqui busca os produtos, faz o for e deleta um por um
        manager.getTransaction().commit();
    }

    public Cardapio busca(Cardapio cardapio) {
        return manager.find(Cardapio.class, cardapio.getId());
    }

}

Tem várias maneiras de fazer o que você precisa, essas são duas delas.

Espero ter ajudado.

Como vou pegar os dados de outra entidade aqui dentro?

Então, tendo as classes Cardapio e Produto ficariam mais ou menos assim:

Cardapio.class:

@Entity
public class Cardapio {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private int id;

    @OneToMany(cascade = CascadeType.REMOVE)
    private Produto produto;

    @NotNull
    private String nome;

}

Produto.class:

@Entity
public class Produto {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private int id;

    @ManyToOne
    private Cardapio cardapio;

    @NotNull
    private String nome;
}

Seria assim?

O que você poderia fazer é dentro de Cardapio ter um OneToMany para Produto, da seguinte maneira:

@OneToMany
@JoinColumn(name = FK_TABELA_CARDAPIO referencedColumnName = PK_TABELA_PRODUTO, insertable = false, updatable = false)
private List<Produto> produtos;

Onde a FK_TABELA_CARDAPIO deve ser a Foreign Key que amarra a tabela de Produto com o Cardápio, algo como: idproduto.

E PK_TABELA_PRODUTO é a chave Primary Key da tabela Produto que esta sendo referenciada dentro da tabela do Cardápio como FK.

Assim o Hibernate irá carregar a lista de itens automáticamente.