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

Usando Entidades que tem comportamentos que dependem de acesso a banco com EJB

Uma boa prática da orientação à objetos é fazer com que dados e comportamentos andem juntos, em um projeto que participei tinhamos um comportamento que em nossa visão não deveria estar em um Session Bean, mas sim na própria classe de entidade. Era um sistema de transporte, onde cada linha tinha uma coleção de sessões, e cada sessão tinha uma tarifa acumulada, que era composta pela soma das sessões anteriores, o método funciona bem, o único problema é a forma como obtemos referência ao nosso session bean que representa o nossoDAO, nós fazemos o lookup hardcoded dentro do método, já que não conseguimos injetar o session bean dentro da classe de entidade nem com @Inject e nem com @EJB

@Entity(name = SecaoLinha.NAME)
@Table(schema="v_geo",name = "secaolinha")

public class SecaoLinha implements Serializable {


    private static final long serialVersionUID = 1L;
    public static final String NAME = "vertran_SecaoLinha";

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "secao_linha_id")
    private Integer secaoLinhaId;

    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    @JoinColumn(name="secao")
    private Secao secao;

    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    @JoinColumn(name="numero")
    private Linha linha;

    @Column(name = "quantidade_sobe")
    private Integer quantidadeSobe;

    @Column(name = "quantidade_desce")
    private Integer quantidadeDesce;

    @Column(name = "quantidade_passageiros")
    private Integer quantidadePassageiros;

    @Column(name = "ordem")
    private Integer ordem;

    public Integer getSecaoLinhaId() {
        return secaoLinhaId;
    }

    public void setSecaoLinhaId(Integer secaoLinhaId) {
        this.secaoLinhaId = secaoLinhaId;
    }

    public Secao getSecao() {
        return secao;
    }

    public void setSecao(Secao secao) {
        this.secao = secao;
    }

    public Linha getLinha() {
        return linha;
    }

    public void setLinha(Linha linha) {
        this.linha = linha;
    }

    public Integer getQuantidadeSobe() {
        return quantidadeSobe;
    }

    public void setQuantidadeSobe(Integer quantidadeSobe) {
        this.quantidadeSobe = quantidadeSobe;
    }

    public Integer getQuantidadeDesce() {
        return quantidadeDesce;
    }

    public void setQuantidadeDesce(Integer quantidadeDesce) {
        this.quantidadeDesce = quantidadeDesce;
    }

    public Integer getQuantidadePassageiros() {
        return quantidadePassageiros;
    }

    public void setQuantidadePassageiros(Integer quantidadePassageiros) {
        this.quantidadePassageiros = quantidadePassageiros;
    }

    public Integer getOrdem() {
        return ordem;
    }

    public void setOrdem(Integer ordem) {
        this.ordem = ordem;
    }

    @Transient
    public double getAcumuladoTarifaSemSanitario() {

        try {

            InitialContext ctx = new InitialContext();

            SecaoLinhaFacade secaoLinhaFacade = (SecaoLinhaFacade) ctx
                    .lookup("java:global/vgeo_ear/vgeo_server/v_SecaoLinhaFacadeBean!br.com.v.server.secaolinha.SecaoLinhaFacade");

            double aux = 0;

            Collection<SecaoLinha> secoesLinha = secaoLinhaFacade
                    .findSecaoLinhaByLinhaAndOrdem(this.getLinha().getNumero(),
                            this.getOrdem());

            for (SecaoLinha sl : secoesLinha) {
                aux = aux + sl.getSecao().getTarifaSemSanitario();
            }

            return aux;

        } catch (Exception e) {
            e.printStackTrace();
            return 0;
        }
    }

    @Transient
    public String getAcumuladoTarifaSemSanitarioStr() {

        try {

            InitialContext ctx = new InitialContext();

            SecaoLinhaFacade secaoLinhaFacade = (SecaoLinhaFacade) ctx
                    .lookup("java:global/vertrangeo_ear/vertrangeo_server/vertran_SecaoLinhaFacadeBean!br.com.vertran.server.secaolinha.SecaoLinhaFacade");

            double aux = 0;

            Collection<SecaoLinha> secoesLinha = secaoLinhaFacade
                    .findSecaoLinhaByLinhaAndOrdem(this.getLinha().getNumero(),
                            this.getOrdem());

            for (SecaoLinha sl : secoesLinha) {
                aux = aux + sl.getSecao().getTarifaSemSanitario();
            }

            return Moeda.mascaraDinheiro(aux, Moeda.DINHEIRO_REAL);

        } catch (Exception e) {

            e.printStackTrace();
            return "";
        }
    }
//e ainda tem varios outros metodos fazendo lookup para acessar o banco
}

Existe alguma forma de receber o Session Bean dentro da classe de entidade utilizando os conceitos de injeção de dependência e evitar esse lookup hardcoded ?

2 respostas
solução!

Oi Ricardo,

eu não conheço não. É um problema comum que a entidade preciso de algum serviço para executar a regra. A solução apresentada fica mais OO mas tem problemas na hora de testar o seu código.

Eu faria isso diferente e passaria o objeto secoesLinha como parametro no método, assim não terá este acomplamento Entidade e SessionBean.

abs

boa Nico, vou testar esta alternativa! obrigado!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software