SessionFactory Hibernate в каждом DAO или только в расширенном классе? - PullRequest
0 голосов
/ 12 мая 2011

Я сталкиваюсь с несколькими огромными проблемами, используя getSession() на HibernateDaoSupport, и теперь, когда я пытаюсь это исправить, мне было интересно, правильно ли делать абстрактный класс, подобный этому, и заставить всех Дао расширять его вместо добавив SessionFactory в каждый Дао?

Если это так, то будет ли создание компонента этого абстрактного класса Дао и передача ему фабрики сессий работать тогда, когда другие Дао расширят его? Или это даже невозможно?

public abstract class AbstractDAOImpl<T> implements
        AbstractDAO<T> {

    private static Logger   _logger = LoggerFactory
                                    .getLogger(AbstractDAOImpl.class);
    private SessionFactory  factory;

    @Override
    public void refresh(final T object) {
        try {
            factory.getCurrentSession().refresh(object);
        } catch (Exception e) {
            _logger.error("Cannot refresh object " + object, e);
        }
    }

    @Override
    public void remove(final T object) {
        try {
            factory.getCurrentSession().delete(object);
        } catch (Exception e) {
            _logger.error("Cannot remove object " + object, e);
        }
    }

    @Override
    public void save(final T object) {
        try {
            factory.getCurrentSession().saveOrUpdate(object);
        } catch (Exception e) {
            _logger.error("Cannot save or update object " + object, e);
        }
    }

}

Ответы [ 2 ]

2 голосов
/ 12 мая 2011
public interface RootDAO<T> extends Serializable {

    public List<T> loadAll();

    public T save(T entity);

    public void delete(T entity);

    public void markAsDeleted(T entity);

    public T get(Serializable id);

    public T load(Serializable id);

    public void saveOrUpdate(T entity);

    public void deleteAll(Collection<T> entities);

    public void saveOrUpdateAll(Collection<T> entities);

    public List<T> find(String hql);

    public void update(T entity);

    public T getByExampleUnique(T entity);

    public List<T> getByExampleList(T entity);

    public List<T> listAll();

    public Object execute(HibernateCallback action);

    public List<T> findByNamedParam(String queryString, String paramName,Object value);

    public List<T> findByNamedParam(String queryString, String[] paramNames,Object[] values);
    .
    .
    .
    .

}

@Component
public abstract class RootDAOImpl<T> extends HibernateDaoSupport implements RootDAO<T> {


    protected Logger logger = LoggerFactory.getLogger(getClass());
    private Class<T> clazz;

    @Autowired
    public void init(SessionFactory factory) {
        setSessionFactory(factory);
    }

    public RootDAOImpl(Class<T> clazz) {
        this.clazz = clazz;
    }

    public void delete(T entity) {
        getHibernateTemplate().delete(entity);
    }

    public void delete(String id) {
        getHibernateTemplate().delete(new FbUser(id));
    }

    public void markAsDeleted(T entity) {
        // Mark entity as deleted
        try {
            Method setDeletedMethod = clazz.getDeclaredMethod("setDeleted", Boolean.class);
            setDeletedMethod.invoke(entity, true);
            getHibernateTemplate().saveOrUpdate(entity);
        } catch (Exception e) {
            e.printStackTrace();
        }
        // actually delete
        // getHibernateTemplate().delete(entity);
    }

    @Override
    public void deleteAll(Collection<T> entities) {
        getHibernateTemplate().deleteAll(entities);
    }

    @Override
    public void saveOrUpdateAll(Collection<T> entities) {
        getHibernateTemplate().saveOrUpdateAll(entities);
    }

    @SuppressWarnings("unchecked")
    @Override
    public T get(Serializable id) {
        return (T) getHibernateTemplate().get(clazz, id);
    }

    @SuppressWarnings("unchecked")
    @Override
    public T load(Serializable id) {
        return (T) getHibernateTemplate().load(clazz, id);
    }

    @SuppressWarnings("unchecked")
    @Override
    public List<T> find(String hql) {
        return (List<T>) getHibernateTemplate().find(hql);
    }

    @Override
    public Object execute(HibernateCallback action) {
        return getHibernateTemplate().execute(action);
    }


    .
    .
    .

}

@Repository
public class UserDAOImpl extends RootDAOImpl<User> implements UserDAO{


    public UserDAOImpl() {
        super(User.class);
    }
}

Если вы не используете платформу DI, вам может понадобиться сохранить ссылку на SessionFactory и передать ее самостоятельно при создании экземпляра DAO.

1 голос
/ 12 мая 2011

Именно поэтому люди используют реализацию JPA в hibernate.Вам просто нужно начать использовать JPA EntityManager, который самостоятельно использует SessionFactory в наилучших возможных шаблонах проектирования.Вам не нужно заново изобретать шаблоны дизайна здесь.Все, что вам нужно сделать, это просто использовать CRUD-операции EntityManager в каждом из ваших DAO, как показано в следующем примере.Всего наилучшего в вашей реализации.

http://www.myhomepageindia.com/index.php/2009/04/02/jpa-hibernate-with-oracle-on-eclipse.html

...