package ylink.hibernate.util.tmp;

import java.io.Serializable;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;


//δɡ



public class ComplexHibernateDAO implements IBaseDAO {
	
	public static ComplexHibernateDAO instance;

	public static ComplexHibernateDAO getInstance () {
		if (null == instance) instance = new ComplexHibernateDAO();
		

		return instance;
	}
	//ͨgetSessionõsessionʵ̰߳ȫ
	public Session getSession() {
		return HibernateSessionFactory.getSession();
	}
	public Session getNewSession() {
		return HibernateSessionFactory.getNewSession();
		
	}
	public Serializable save(Object obj)
	{
		//HibernateSessionFactory.getSession().save(obj);
		if (isInTransaction())
		{
			return save(obj, getSession());
		}
		//УĿһ񣬶󣬹رsession
		try {
			beginTransaction();
			Serializable rtn = save(obj, getSession());
			commitTransaction();
			return rtn;
		}
		catch (HibernateException e) {
			rollbackTransaction();
            throw e;
		}
		finally {			
			//ύ
			//closeSession();
		}
		
	}
	public Serializable save(Object obj, Session s) throws HibernateException {
		return s.save(obj);
	}
	
	public void delete(Object obj)
	{
		//HibernateSessionFactory.getSession().delete(obj);
		if (isInTransaction())
		{
			delete(obj, getSession());
			return;
		}
		//УĿһ
		try {
			beginTransaction();
			delete(obj, getSession());
			commitTransaction();
		}
		catch (HibernateException e) {
			rollbackTransaction();
            throw e;
		}
		finally {
			closeSession();
		}
		
	}
	public void delete(Object obj, Session s)
	{
		s.delete(obj);
	}
	public void update(Object obj)
	{
		//HibernateSessionFactory.getSession().delete(obj);
		if (isInTransaction())
		{
			update(obj, getSession());
			return;
		}
		//УĿһ
		try {
			beginTransaction();
			update(obj, getSession());
			commitTransaction();
		}
		catch (HibernateException e) {
			rollbackTransaction();
            throw e;
		}
		finally {
			closeSession();
		}
		
	}
	public void update(Object obj, Session s)
	{
		s.update(obj);
	}
	public void saveOrUpdate(Object obj)
	{
		if (isInTransaction())
		{
			saveOrUpdate(obj, getSession());
			return;
		}
		//УĿһ
		try {
			beginTransaction();
			saveOrUpdate(obj, getSession());
			commitTransaction();
		}
		catch (HibernateException e) {
			rollbackTransaction();
            throw e;
		}
		finally {
			//closeSession();
		}
		
	}
	public void saveOrUpdate(Object obj, Session s)
	{
		s.saveOrUpdate(obj);
	}
	public void beginTransaction()
	{
		//HibernateSessionFactory.getSession().getTransaction().begin()
		//Transaction tx = HibernateSessionFactory.getSession().beginTransaction();
		//ǵȼ۵
		Session session = (Session) getSession();
		beginTransaction(session);
		
	}
	public Transaction beginTransaction(Session s) throws HibernateException {
		return s.beginTransaction();
	}
	
	public void commitTransaction() 
	{
		//HibernateSessionFactory.getSession().getTransaction().commit();
		Session session = (Session) getSession();
		commitTransaction(session);
	}	
	public void commitTransaction(Session s) 
	{
		s.getTransaction().commit();
	}	
	public void rollbackTransaction()
	{
		//HibernateSessionFactory.getSession().getTransaction().rollback();
		Session session = (Session) getSession();
		rollbackTransaction(session);
	}	
	public void rollbackTransaction(Session s)
	{
		s.getTransaction().rollback();
	}	
	public void closeSession (Session session) throws HibernateException 
	{
		if (null != session && session.isOpen()) 
		{
			session.close();
		}
	}
	public void closeSession () throws HibernateException 
	{
		Session session = (Session) getSession();
		closeSession(session);
		
	}	
	public boolean isInTransaction(Session session)
	{
		boolean bRet;
		if (null != session )
		{
			bRet = session.getTransaction().wasCommitted();
			return bRet;
		}
		else
			return false;
	}
	public boolean isInTransaction()
	{
		Session session = (Session) getSession();
		return isInTransaction(session);
	}
	public void showSessionState(Session s)
	{
		
		//bRet  = s.isDirty();
		//bRet = s.isOpen();
		//bRet = s.getTransaction().isActive();
		//bRet = s.getTransaction().wasCommitted();
		
		if (s!=null)
		{
			System.out.println("Session:isDirty()="+s.isDirty()+";isOpen()="+s.isOpen());
			if (s.getTransaction()!=null)
				System.out.println("Transaction:isActive()="+s.getTransaction().isActive()+";wasCommitted()="+s.getTransaction().wasCommitted());
			else
				System.out.println("Transaction:null");
		}
	}
	
}