Esse assunto de entidades inteligentes também me deixou muito intrigado.
Recentemente estive pensando no assunto e até cheguei a criar entidades com lógicas de persistência.
@Entity
public class Cliente {
//atributos...
public void salvar(EntityManager em) {
//grava ou atualiza a si mesmo
}
public void remover(EntityManager em) {
//remove a si mesmo da base
}
public List<Cliente> listarPorID(EntityManager em, int ID) {
//busca clientes por ID
}
public List<Cliente> listarPorNome(EntityManager em, String nome) {
//busca clientes por nome
}
public List<Cliente> listarPorPedido(EntityManager em, Pedido pedido) {
//busca clientes por pedido
}
}
Logo percebi que não fazia sentido (ou posso estar enganado) um cliente gravar a si mesmo no banco de dados ou ainda realizar consultas que retornem outros clientes.
Por esse motivo, acho que faz muito mais sentido apenas chamar o método merge() ou remove() do EntityManager para ações simples de inserção ou remoção de entidades da base de dados na própria ação de um botão, como por exemplo:
@ManagedBean
public class ClienteMB {
//atributos...
Cliente c;
EntityManager em;
public void salvar(ActionEvent e) {
//grava ou atualiza um cliente
em.merge(c);
}
public void remover(ActionEvent e) {
//remove um cliente
em.remove(c);
}
}
Ou ainda criar uma classe especifica para cuidar de consultas ou de lógicas mais complexas de inserção ou remoção de entidades:
public class ClienteDAO {
//atributos...
EntityManager em;
public void salvar(ActionEvent e) {
//grava ou atualiza um cliente com logica complexa
}
public void remover(ActionEvent e) {
//remove um cliente da base com logica complexa
}
public List<Cliente> listarPorID(ActionEvent e, Cliente c) {
//busca clientes por ID
}
public List<Cliente> listarPorNome(ActionEvent e, Cliente c) {
//busca clientes por nome
}
public List<Cliente> listarPorPedido(ActionEvent e, Pedido pedido) {
//busca clientes por pedido
}
}
Por isso acho que os métodos de entidade devem refletir o que aquela entidade faz, e somente isso.
Na minha opinião, não faz sentido um cliente gravar ou remover a si próprio ou a outros clientes da base, por isso, faria muito mais sentido que essas funções fossem executada por uma outra classe responsável unicamente por gerenciar a interação da entidade com o banco de dados.
Essa foi a impressão que tive observando essas situações.
Vamos ver o que o pessoal mais experiente tem a dizer sobre o assunto.
Obrigado e até mais pessoal.