Hibernate DAO реализация - PullRequest
       13

Hibernate DAO реализация

0 голосов
/ 23 апреля 2009

Кто-нибудь может предложить реализацию DAO для веб-приложения?

В чем будет проблема, если я создам транзакцию для основной операции (например, findByID(), findALL(), createObject(), deleteObject() и т. Д.)?

Пожалуйста, предложите реализацию DAO, которая поддерживает отложенные операции.

Ответы [ 2 ]

1 голос
/ 23 апреля 2009

Если вы используете Hibernate Tools для генерации вашего кода, базовые DAO будут созданы для вас автоматически. Вы можете опираться на них.

В любом случае, фрагмент кода, который я использую для транзакции:

public void executeTransaction(Object[] parameters, Transact transact) throws ApplicationException
{
    Transaction tx = null;
    try
    {
        tx = HibernateSessionFactory.getSession().beginTransaction();
        transact.execute(parameters, tx);
        tx.commit();
        LOG.trace("executeTransaction() success");
    }
    catch (Exception e)
    {
        rollback(tx);
        throw new ApplicationException(e);
    }
}

private void rollback(Transaction tx) throws ApplicationException
{
    LOG.warn("rollback()");
    if (tx != null)
    {
        try
        {
            tx.rollback();
        }
        catch (Exception ex)
        {
            LOG.error("rollback() failure",ex);                
        }
    }
}

public interface Transact
{
    public void execute(Object[] parameters, Transaction tx) throws Exception;
}

void updateDistrictImpl(final Distretto district) throws ApplicationException, ApplicationValidationException
{    
try
{
    LOG.trace("updateDistrict[" + distrettoToString(district) + "]");

    executeTransaction(new Transact() {
        public void execute(Object[] parameters, Transaction tx) throws ApplicationException
        {
            DistrettoHome DistrettoDAO = new DistrettoHome();
            DistrettoDAO.attachDirty(district);
        }
        });
    LOG.info("updateDistrict[" + distrettoToString(district) + "] success!");
}
catch (ApplicationException e)
{
    LOG.error("updateDistrict() exception: " + e.getLocalizedMessage(), e);
    throw e;
}
}
0 голосов
/ 23 апреля 2009

Есть 3 основных варианта:

1) Правильно настройте отложенную загрузку в ваших сопоставлениях и запросах: это не всегда самый простой способ, поскольку вы не всегда знаете, как ваши объекты будут использоваться на уровне представления при разработке DAO.

2) Используйте шаблон OpenSessionInView: таким образом, вы сможете лениво загружать связанные объекты на уровне представления. Это, вероятно, самый простой способ, так как он требует лишь немного настройки. Но будьте осторожны, так как отложенная загрузка может быть довольно дорогой, и если вы делаете что-то подозрительное на уровне презентации, вы можете столкнуться с проблемами производительности. Вы также можете изменить свои объекты из презентации, что означает, что легче делать ошибки при предварительном программировании.

3) Добавьте сервисный слой, который преобразует ваш объект Hibernate в объекты-значения: это наиболее точный вариант, поскольку вы также можете ограничить свойства wchi, представленные в презентации. Вы сохраняете границы транзакций вокруг вызова службы, поэтому вы уверены, что ничего не будет изменено за пределами службы.

Во всех случаях вы должны хотя бы попытаться правильно настроить отложенную загрузку. В противном случае у вас могут возникнуть проблемы с производительностью!

...