cliente.pagar(faturaEmAtrazo);Cliente é uma entidade do sistema, com isso não quero dizer que o cliente deve ter a lógica de pagamento de faturas, mais é ele quem inicia o processo, de onde então vem a lógica? De uma service:
public class ControleDeFaturas { public void receberPagamento(Cliente cliente,Fatura fatura){ .... // aqui residiria a lógica de } }e o cliente como fica? Ele recebe por Dependency Injection o serviço de controle de faturas, usando o framework seam teriamos algo como:
@Entity public class Cliente { @In private ControleDeFaturas controleDeFaturas; ... public void pagar(Fatura fatura){ controleDeFaturas.receberPagamento(this,fatura); } }Assim o modelo fica melhor, agora um problema que temos no SEAM é que ele não faz injeção de dependências nas entitys, para resolver este problema temos várias soluções, poderíamos usar a entity com uma factory que receberia o controleDeFaturas, ou mesmo fazer lookup da dependência usando Component.getInstance("controleDeFaturas"), uma abordagem que usei a qual estou gostando é o uso de Aspectos, aspecto resolve este problema, de uma forma transparente, onde mesmo se instanciarmos o Cliente por meio de um new Cliente(); ainda teríamos a injeção da dependência.
você pode visualizar a classe aqui que resolveu meu problema (usa aspectj).
Com certeza a classe pode ser melhorada, mas inicialmente resolveu o problema e permitiu uma habilitação de um domínio rico usando o SEAM, basicamente ele injeta uma instancia sempre que encontra uma classe com a anotação @Entity e um @In tanto faz ser nos atributos da classe, ou nos métodos acessores.
Devo agradecer ao Alessandro Lazarotti que sugeriu o aspecto acima como solução no fórum do guj.