package com.fp.persistence.pgeneral.product;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Column;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.Query;
import java.io.Serializable;
import javax.persistence.Table;
import com.fp.dto.hb.HibernateBean;
import javax.persistence.Version;
import java.lang.reflect.Field;
import javax.persistence.Transient;

/**Clase que implementa la entidad de Hibernate que hace referencia a la tabla TGENEMODULE*/
@Entity(name="TgeneModule")
@Table(name="TGENEMODULE")
public class TgeneModule extends com.fp.dto.AbstractDataTransport implements Serializable,HibernateBean,Cloneable{
/**
* HashCode asociado con la Instancia
*/
@Transient
private int hashValue = 0;
/**
* Version de la Clase
*/
private static final long serialVersionUID = 1L;
	/**
	* Clave primaria de la Entidad TgeneModule
	*/
	@Id
	@Column(name="MODULECODE" ,nullable=false, updatable=false)
	private String pk;
	@Version
	@Column(name="RECORDVERSION", nullable=true)
	
	/**
	* Optimistic locking del registro
	*/
	private Integer recordversion;
	
	@Column(name="DESCRIPTION", nullable=false)
	
	/**
	* Descripcion del modulo
	*/
	private String description;
	
	@Column(name="ISVISIBLE", nullable=true)
	
	/**
	* null
	*/
	private String isvisible;
	
	/**Contructor por defecto*/
	public TgeneModule(){
	}
	/**Contructor de TgeneModule
	@param pPk Clave Primaria del entity
	@param pDescription Descripcion del modulo
	*/
	public TgeneModule(String pPk,String pDescription){
	 this();
	 pk=pPk;
	 description=pDescription;
	}
	/**
	* Metodo que entrega datos de la tabla dada la clave primaria.
	* @param pEntityManager referencia de la session a obtener datos del bean.
	* @param pKey Caleve primaria del bean.
	* @return TgeneModule
	*/
	public static TgeneModule find(EntityManager pEntityManager,Object pKey) throws Exception{
	    TgeneModule obj = pEntityManager.find(TgeneModule.class,pKey);
	    return obj;
	}
	/**Entrega la Clave primaria de TgeneModule
	@return El objeto que referencia a la Clave primaria de TgeneModule
	*/
	public String getPk(){
	  return pk;
	}
	/**Fija un nuevo valor a la Clave primaria de TgeneModule
	@param pPk El objeto que referencia a la nueva Clave primaria de TgeneModule
	*/
	public void setPk(String pPk){
	  pk=pPk;
	}
	/**Obtiene el valor de recordversion
	@return valor de recordversion*/
	public Integer getRecordversion(){
	  return recordversion;
	}
	/**Fija el valor de recordversion
	@param pRecordversion nuevo Valor de recordversion*/
	public void setRecordversion(Integer pRecordversion){
	  recordversion=pRecordversion;
	}
	
	/**Obtiene el valor de description
	@return valor de description*/
	public String getDescription(){
	  return description;
	}
	/**Fija el valor de description
	@param pDescription nuevo Valor de description*/
	public void setDescription(String pDescription){
	  description=pDescription;
	}
	
	/**Obtiene el valor de isvisible
	@return valor de isvisible*/
	public String getIsvisible(){
	  return isvisible;
	}
	/**Fija el valor de isvisible
	@param pIsvisible nuevo Valor de isvisible*/
	public void setIsvisible(String pIsvisible){
	  isvisible=pIsvisible;
	}
	
	public boolean equals(Object rhs){
	    if (rhs == null)return false;
	    if (! (rhs instanceof TgeneModule))return false;
	    TgeneModule that = (TgeneModule) rhs;
	    if (this.getPk() == null || that.getPk() == null)
	        return false;
	    return (this.getPk().equals(that.getPk()));
	}
	/**Implementación del metodo hashCode de la la entidad TgeneModule
	@return el hashCode la instancia
	*/
	public int hashCode()    {
	    if (this.hashValue == 0){
	        int result = 17;
	        if (this.getPk() == null){
	            result = super.hashCode();
	        }else{
	            result = this.getPk().hashCode();
	        }
	        this.hashValue = result;
	    }
	    return this.hashValue;
	}
	/**Implementación toString
	*/
	public String toString() {
		Field[]fs=this.getClass().getDeclaredFields();
		String data="";
		for(Field f:fs){
		 try{	
		 String name=f.getName();
	   if(f.getType().getName().compareTo("java.util.Set")==0)continue;
		 if(name.compareTo("hashValue")==0||name.compareTo("serialVersionUID")==0)continue;
			data+=name+"="+f.get(this)+";";
		 }catch(Exception e){
			 continue;
		 }
			}
			if(data.compareTo("")==0){
			data=super.toString();
			}
		return data;
		}
	/**Implementación de la creación de un bean en blanco TgeneModule
	*/
	public Object createInstance(){
	 TgeneModule instance=new TgeneModule();	
	 return instance;
	}
	/**Clona la entidad TgeneModule
	@see com.fp.dto.hb.HibernateBean#cloneMe()
	*/
	public Object cloneMe() throws CloneNotSupportedException{
	  TgeneModule p=(TgeneModule)this.clone();
	  return p;
	}

	//Metodos manuales
	
	/**
	 * Sentencia que devuelve un registro de TgeneModule.
	 */
	private static final String JPQL_TGENE_MODULE =
	        "from TgeneModule tmod  "
	        + " where tmod.pk = :modulecode";
	
	/**
	 * Metodo que obtiene datos de un registro del modulo.
	 * @param pModulecode  Codigo de modulo a obtener datos de la base.
	 * @return  TgeneModule
	 * @throws Exception
	 */
	public static TgeneModule find(EntityManager pEntityManager,String pModulecode) throws Exception {
	    Query qry = pEntityManager.createQuery(JPQL_TGENE_MODULE);
	    qry.setParameter("modulecode", pModulecode);
	    try {
	    	return (TgeneModule) qry.getSingleResult();	
		} catch (NoResultException e) {
			return null;
		}
	}

}
