package com.fp.persistence.pgeneral.acco;

import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.Column;
import javax.persistence.EntityManager;
import javax.persistence.LockModeType;
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 java.util.List;

import javax.persistence.Transient;

/**Clase que implementa la entidad de Hibernate que hace referencia a la tabla TGENESEQUSTRUCTDETAIL*/
@Entity(name="TgeneSequStructDetail")
@Table(name="TGENESEQUSTRUCTDETAIL")
public class TgeneSequStructDetail 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 TgeneSequStructDetail
	*/
	@EmbeddedId
	private TgeneSequStructDetailKey pk;
	@Version
	@Column(name="RECORDVERSION", nullable=true)
	
	/**
	* Optimistic locking del registro
	*/
	private Integer recordversion;
	
	/**Contructor por defecto*/
	public TgeneSequStructDetail(){
	}
	/**Contructor de TgeneSequStructDetail
	@param pPk Clave Primaria del entity
	*/
	public TgeneSequStructDetail(TgeneSequStructDetailKey pPk){
	 this();
	 pk=pPk;
	}
	/**
	* 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 TgeneSequStructDetail
	*/
	public static TgeneSequStructDetail find(EntityManager pEntityManager,TgeneSequStructDetailKey pKey) throws Exception{
	    TgeneSequStructDetail obj = pEntityManager.find(TgeneSequStructDetail.class,pKey);
	    return obj;
	}
	/**Entrega la Clave primaria de TgeneSequStructDetail
	@return El objeto que referencia a la Clave primaria de TgeneSequStructDetail
	*/
	public TgeneSequStructDetailKey getPk(){
	  return pk;
	}
	/**Fija un nuevo valor a la Clave primaria de TgeneSequStructDetail
	@param pPk El objeto que referencia a la nueva Clave primaria de TgeneSequStructDetail
	*/
	public void setPk(TgeneSequStructDetailKey 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;
	}
	
	public boolean equals(Object rhs){
	    if (rhs == null)return false;
	    if (! (rhs instanceof TgeneSequStructDetail))return false;
	    TgeneSequStructDetail that = (TgeneSequStructDetail) 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 TgeneSequStructDetail
	@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 TgeneSequStructDetail
	*/
	public Object createInstance(){
	 TgeneSequStructDetail instance=new TgeneSequStructDetail();	
	 instance.setPk(new TgeneSequStructDetailKey());
	 return instance;
	}
	/**Clona la entidad TgeneSequStructDetail
	@see com.fp.dto.hb.HibernateBean#cloneMe()
	*/
	public Object cloneMe() throws CloneNotSupportedException{
	  TgeneSequStructDetail p=(TgeneSequStructDetail)this.clone();
	  p.setPk((TgeneSequStructDetailKey)this.pk.cloneMe());
	  return p;
	}

	// METODOS MANUALES
    /**
     * Sentencia que obtiene la estructura de secuencial para crear un numero de cuenta.
     */
    private static final String JPQL = "from TgeneSequStructDetail t " + " where t.pk.sequcode = :sequcode";

    /**
     * Metodo que entrega la estructura de secuencial para un numero de cuenta
     * 
     * @param pEntityManager referencia de la session a obtener datos del bean.
     * @param pSequcode Codigo del secuencial
     * @return TgeneSequStructDetail
     */
    @SuppressWarnings("unchecked")
    public static List<TgeneSequStructDetail> find(EntityManager pEntityManager, String pSecucode) throws Exception {
        Query qry = pEntityManager.createQuery(TgeneSequStructDetail.JPQL);
        qry.setParameter("sequcode", pSecucode);
        qry.setLockMode(LockModeType.PESSIMISTIC_READ);
        return qry.getResultList();
    }

}
