All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.daedafusion.hibernate.dao.AbstractDAO Maven / Gradle / Ivy

package com.daedafusion.hibernate.dao;

import com.daedafusion.hibernate.HibernateSessionFactory;
import org.apache.log4j.Logger;
import org.hibernate.Criteria;
import org.hibernate.LockOptions;
import org.hibernate.Session;

import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.util.Collection;
import java.util.LinkedHashSet;

/**
 * Created by mphilpot on 7/3/14.
 */
public abstract class AbstractDAO implements GenericDAO
{
    private static final Logger log = Logger.getLogger(AbstractDAO.class);

    private Class persistentClass;
    private Session  session;

    protected AbstractDAO()
    {
        persistentClass = (Class) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
    }

    public void setSession(Session s)
    {
        session = s;
    }

    protected Session getSession()
    {
        if(session == null)
        {
            session = HibernateSessionFactory.getInstance().getSession();
        }

        return session;
    }

    protected Class getPersistentClass()
    {
        return persistentClass;
    }


    @Override
    public T findById(ID id)
    {
        return (T) getSession().load(getPersistentClass(), id);
    }

    @Override
    public T findById(ID id, boolean lock)
    {
        if(lock)
        {
            return (T) getSession().load(getPersistentClass(), id, LockOptions.UPGRADE);
        }
        else
        {
            return findById(id);
        }
    }

    @Override
    public Collection findAll()
    {
        Criteria crit = getSession().createCriteria(getPersistentClass());

        // When FetchType.EAGER is set, the outer join produces multiple instances of the same database object.  We want to
        // dedup while retaining order
        return new LinkedHashSet(crit.list());
    }

    @Override
    public T makePersistent(T entity)
    {
        getSession().saveOrUpdate(entity);
        return entity;
    }

    @Override
    public void makeTransient(T entity)
    {
        getSession().delete(entity);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy