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 ?