I have many Tables, For every Table,we have DAO Interface and DAOImplementation class.Example DAO Interfacepublic interface CancelPolicyDAO {public CancelPolicy insertCancelPolicy(CancelPolicy cpdao)throws ChannelDispatcherException;public CancelPolicy updateCancelPolicy(CancelPolicy cpdao)throws ChannelDispatcherException;public void deleteCancelPolicy(CancelPolicy cpdao)throws ChannelDispatcherException;public CancelPolicy findByCancelPolicyData(Integer id, Integer offSetUM, Integer nights, Float pOrAm, Byte isPercent)throws ChannelDispatcherException;public CancelPolicy findByCancelPolicyId(Integer id)throws ChannelDispatcherException;}Example DAOImplementation class  public class CancelPolicyDAOImpl implements CancelPolicyDAO {@Overridepublic CancelPolicy insertCancelPolicy(CancelPolicy bean) throws ChannelDispatcherException {    Session ses = null;    try {        ses = HibernateConnector.getInstance().getSession();        ses.save(bean);        ses.flush();        return bean;    } catch (Exception e) {        e.printStackTrace();        throw new ChannelDispatcherException(DbUtil.getStackTraceMessage(e));    } finally {        if (ses != null) {            try {                ses.close();            } catch (Exception er) {                er.printStackTrace();            }        }    }}@Overridepublic CancelPolicy updateCancelPolicy(CancelPolicy bean) throws ChannelDispatcherException {    Session sess = null;    try {        sess = HibernateConnector.getInstance().getSession();        sess.update(bean);        sess.flush();        return bean;    } catch (Exception e) {      e.printStackTrace();        throw new ChannelDispatcherException(DbUtil.getStackTraceMessage(e));    }}@Overridepublic void deleteCancelPolicy(CancelPolicy bean) throws ChannelDispatcherException {    Session sess = null;    try {        sess = HibernateConnector.getInstance().getSession();        sess.delete(bean);        sess.flush();    } catch (Exception e) {     e.printStackTrace();        throw new ChannelDispatcherException(DbUtil.getStackTraceMessage(e));    }}@Overridepublic CancelPolicy findByCancelPolicyData(Integer id, Integer offSetUM, Integer nights, Float pOrAm, Byte isPercent) throws ChannelDispatcherException {    Session ses = null;    try {        ses = HibernateConnector.getInstance().getSession();        Query query = ses.createQuery(from CancelPolicy a where                 +  a.cancelPolicyTypeId =:cancelPolicyTypeId                  +  and   a.offsetUnitMultiplier =:offsetUnitMultiplier                  +  and   a.nights =:nights                  +  and   a.percentOramount =:percentOramount                 +  and   a.isPercent =:isPercent);        query.setParameter(cancelPolicyTypeId, id);        query.setParameter(offsetUnitMultiplier, (offSetUM));        query.setParameter(nights, (nights));        query.setParameter(percentOramount, pOrAm);        query.setParameter(isPercent, isPercent);        List queryList = query.list();        if (queryList != null && queryList.isEmpty()) {            return null;        } else {            return (CancelPolicy) queryList.get(0);        }    } catch (Exception e) {       e.printStackTrace();        throw new ChannelDispatcherException(DbUtil.getStackTraceMessage(e));    } finally {        if (ses != null) {            try {                ses.close();            } catch (Exception e) {                e.printStackTrace();            }        }    }}public CancelPolicy findByCancelPolicyId(Integer id) throws ChannelDispatcherException {    Session ses = null;    try {        ses = HibernateConnector.getInstance().getSession();        Query query = ses.createQuery(from CancelPolicy a where                 +  a.id =:id  );        query.setParameter(id, id);        List queryList = query.list();        if (queryList != null && queryList.isEmpty()) {            return null;        } else {            return (CancelPolicy) queryList.get(0);        }    } catch ( Exception e) {       e.printStackTrace();        throw new ChannelDispatcherException(DbUtil.getStackTraceMessage(e));    } finally {        if (ses != null) {            try {                ses.close();            } catch (Exception e) {                e.printStackTrace();            }        }    }}  Example main method   public static void main(String[] args)  {       // How to handel Transaction in Hibernate ?     CancelPolicyDAO cancelPolicyDAO = HibernateDAOFactory.getInstance().getCancelPolicyDAO();     CancelPolicy insertCancelPolicy = cancelPolicyDAO.findByCancelPolicyData(2, 76, 25, 25.36f, 3);    if(insertCancelPolicy==null){        CancelPolicy cancelPolicy = new CancelPolicy();    cancelPolicy.setCancelPolicyTypeId(1);    cancelPolicy.setNights(2);     insertCancelPolicy = cancelPolicyDAO.insertCancelPolicy(cancelPolicy);    }    Integer autoIncrementId = insertCancelPolicy.getId();    AvailabilityDAO availabilityDAO =  HibernateDAOFactory.getInstance().getAvailabilityDAO();    Availability availability = new Availability();//        using  CancelPolicy autoIncrementId     availability.setId(autoIncrementId);    availability.setCount(2);    availability.setMaxLos(5);    availabilityDAO.insertAvailability(availability);    .    .    .    .    . }Now my question is how do i handle Transaction in DAOImpl's ? Should i pass Session Object as parameter for every DAOImpl's or is there is any better Approach 
Transaction Management in Hibernate with DAO Design Pattern
java;design patterns;hibernate;transaction;dao