/* * * Copyright (c) 2013 - 2014 INT - National Institute of Technology & COPPE - Alberto Luiz Coimbra Institute - Graduate School and Research in Engineering. * See the file license.txt for copyright permission. * */ /** * */ package modelo; import java.io.Serializable; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.NamedQueries; import javax.persistence.NamedQuery; import javax.persistence.OrderBy; import javax.persistence.SequenceGenerator; import javax.persistence.Table; import javax.persistence.Transient; /** * Classe relativa ao bean correspondente a entidade TecModel, que relaciona Tecido e Modelo. * Informa o consumo de Tecido/Renda para cada Modelo. * * @author marques.araujo * */ @NamedQueries( { @NamedQuery(name = "TecModel.recuperaListaDeTecModelsComTecidoComModelos", query = "select tm from TecModel tm " + "left outer join fetch tm.tecido " + "left outer join fetch tm.modelo " ), @NamedQuery(name = "TecModel.recuperaTecModelPorTecidoEModelo", query = "select tm from TecModel tm " + "left outer join fetch tm.tecido " + "left outer join fetch tm.modelo " + "where tm.tecido = ? and tm.modelo = ?" ) }) @Entity @Table(name = "TECMODEL") @SequenceGenerator(name = "SEQUENCIA", sequenceName = "SEQ_TECMODEL", allocationSize = 1) public class TecModel implements Serializable, Comparable<TecModel> { private static final long serialVersionUID = 1L; /** * Identificador de TecModel. * */ private Long id; /** * Tempo de defasagem no uso do Tecido (em dias). * */ private Double tempoDefasagemUsoTec; /** * Consumo do Tecido pelo modelo, por lote, em metros. * */ private Double consumoPorLoteMt; /** * Um Tecido pertence a muitos TecModels. * */ private Tecido tecido; /** * Um Modelo pertence a muitos TecModels. * */ private Modelo modelo; /** * Este modificador esta sendo usado, pois este eh um * campo calculado e nao deve existir no banco de dados. * Vide tambem a Anota��o Transiente feita no get do referido * campo neste caso o campo consumoPorLoteKg. * Campo calculado a partir do campo ConsumoPorLoteMt, conforme o seguinte calculo: * consumoPorLoteKg = (ConsumoPorLoteMt * (PercentualDePerda/100 + 1))/ FatorRendimento * */ private transient Double consumoPorLoteKg; public TecModel() { } // ********* M�todos get/set ********* @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQUENCIA") @Column(name = "ID") public Long getId() { return id; } public void setId(Long id) { this.id = id; } public Double getTempoDefasagemUsoTec() { return tempoDefasagemUsoTec; } public void setTempoDefasagemUsoTec(Double tempoDefasagemUsoTec) { this.tempoDefasagemUsoTec = tempoDefasagemUsoTec; } public Double getConsumoPorLoteMt() { return consumoPorLoteMt; } public void setConsumoPorLoteMt(Double consumoPorLoteMt) { this.consumoPorLoteMt = consumoPorLoteMt; } // ********* M�todos para Associa��es ********* /* * O atributo fetch indica se a associa��o deve ser carregada atrav�s da * utiliza��o de proxy (de fotecma "lazy") ou se ela deve ser carregada * antecipadamente. Neste caso, o default � EAGER (recupera��o antecipada). * * O elemento @JoinColumn tb � opcional. Se o nome da FK n�o for declarada a * JPA automaticamente utiliza a combina��o: nome da entidade alvo (PRODUTO, * neste caso) concatenado ao nome da propriedade identificadora no banco de * dados (ID, neste caso). */ // lazy significa que nao vou trazer automaticamente o outro elemento da // associa��o // com a anota�ao Manytoone � possivel que estando no tecmodel consiga // recuperar o tecido // sem esta anota�ao nao adianta ter o metodo @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "TECIDO_ID", nullable = false) // name define o nome da chave estrangeira na tabela @OrderBy("codTecido") public Tecido getTecido() { return tecido; } public void setTecido(Tecido tecido) { this.tecido = tecido; } @ManyToOne(fetch = FetchType.EAGER) @JoinColumn(name = "MODELO_ID", nullable = false) // name define o nome da chave estrangeira na tabela @OrderBy("codModelo") public Modelo getModelo() { return modelo; } public void setModelo(Modelo modelo) { this.modelo = modelo; } @Transient public Double getConsumoPorLoteKg() { return consumoPorLoteKg; } public void setConsumoPorLoteKg(Double consumoPorLoteKg) { this.consumoPorLoteKg = consumoPorLoteKg; } public String toString(){ return " Id do TecModel="+this.id+" tempoDefasagemUsoTec="+this.tempoDefasagemUsoTec+" consumoPorLoteMt="+this.consumoPorLoteMt+" Tecido="+this.getTecido().getCodTecido(); } /** * * Este m�todo consiste em definir o crit�rio de ordena��o entre 2 objetos TecModels, que deve estar * associado a um de seus atributos. No nosso caso, os atributos em quest�o s�o o 'tecido' e o 'modelo', * estes objetos tambem possuem um criterio de compara�ao internamente e podem se auto-ordenar, gra�as * a implementa��o da API Java que o realiza. * * @author marques.araujo * @param TecModel * @return int */ @Override public int compareTo(TecModel outro) { int valor = tecido.compareTo(outro.tecido); if(valor==0){ valor = modelo.compareTo(outro.modelo); } return (valor != 0 ? valor : 1); } /** * Este m�todo poder ser gerado AUTOMATICAMENTE pelo Java , juntamente com o m�todo "equals(Object obj)". * Eles S�o necess�rios para determinarmos um criterio de igualdade entre 2 objetos. * * Obs.: � primoridal dar aten��o para este detalhe, principalmente quando trabalhamos com Estruturas * de Dados como Set. * * @return int */ @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((consumoPorLoteMt == null) ? 0 : consumoPorLoteMt.hashCode()); result = prime * result + ((id == null) ? 0 : id.hashCode()); result = prime * result + ((modelo == null) ? 0 : modelo.hashCode()); result = prime * result + ((tecido == null) ? 0 : tecido.hashCode()); result = prime * result + ((tempoDefasagemUsoTec == null) ? 0 : tempoDefasagemUsoTec .hashCode()); return result; } /** * * Este m�todo pode ser gerado AUTOMATICAMENTE pelo Java , juntamente com o m�todo * "hashCode()". Estes metodos s�o necess�rios para se determinar um crit�rio principal * de igualdade entre 2 objetos. * * @param Object * @return boolean */ @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; TecModel other = (TecModel) obj; if (consumoPorLoteMt == null) { if (other.consumoPorLoteMt != null) return false; } else if (!consumoPorLoteMt.equals(other.consumoPorLoteMt)) return false; if (id == null) { if (other.id != null) return false; } else if (!id.equals(other.id)) return false; if (modelo == null) { if (other.modelo != null) return false; } else if (!modelo.equals(other.modelo)) return false; if (tecido == null) { if (other.tecido != null) return false; } else if (!tecido.equals(other.tecido)) return false; if (tempoDefasagemUsoTec == null) { if (other.tempoDefasagemUsoTec != null) return false; } else if (!tempoDefasagemUsoTec.equals(other.tempoDefasagemUsoTec)) return false; return true; } }