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());
}
Só para entender Cardapio tem vários Produto? Se sim, você pode, simplesmente, mapear para ser delete cascade.
Exato! Mas como eu faço isso?
Usando a propriedade cascade que as anotações @OneToMany e @ManyToMany disponibilizam:
cascade = CascadeType.ALL
Com o type ALL você deixa todas as operações de banco como sendo em cascata.
Mas, existem os tipo “DELETE”, “UPDATE”, etc.
Porém, eu faria diferente. Excluiria todos os produtos com o ID do cardápio e, só então, excluiria o mesmo. Puxaria o controle para mim.
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?
Modelo do Cardápio:
@Entity
public class Cardapio {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@OneToMany(cascade = CascadeType.ALL, mappedBy="cardapio")
private List<Produto> produto;
...
}
Modelo do produto:
@Entity
public class Produto {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
@ManyToOne
@JoinColumn(name="cardapio_id")
private Cardapio cardapio;
...
}