Пример завершения транзакции в спящем режиме - PullRequest
2 голосов
/ 02 марта 2011

Это очень простой пример использования спящего режима в java: функция, которая при вызове создает новый объект в базе данных.Если все идет хорошо, изменения сохраняются и видны сразу (никаких проблем с кешем).Если что-то не получается, базу данных следует восстановить, как если бы эта функция никогда не вызывалась.

public String createObject() {
    PersistentTransaction t = null;
    try {
        t = PersistentManager.instance().getSession().beginTransaction();
        Foods f = new Foods(); //Foods is an Hibernate object
        //set some values on f
        f.save();
        t.commit();
        PersistentManager.instance().getSession().clear();
        return "everything allright";
    } catch (Exception e) {
        System.out.println("Error while creating object");
        e.printStackTrace();
        try {
            t.rollback();
            System.out.println("Database restored after the error.");
        } catch (Exception e1) {
            System.out.println("Error restoring database!");
            e1.printStackTrace();
        }
    }
    return "there was an error";
}

Есть ли ошибка?Вы бы что-нибудь изменили / улучшили?

Ответы [ 2 ]

3 голосов
/ 02 марта 2011

Я не вижу ничего плохого в вашем коде здесь. Как упомянул @Vinod, мы полагаемся на фреймворки, такие как Spring, для обработки утомительного кода котельной плиты. В конце концов, вы не хотите, чтобы подобный код существовал во всех возможных методах DAO, которые у вас есть. Они затрудняют чтение и отладку.

Одним из вариантов является использование AOP, когда вы применяете рекомендации AspectJ "вокруг" к вашему методу DAO для обработки транзакции. Если вы не чувствуете себя комфортно с AOP, то вы можете написать свою собственную обертку котельной плиты, если вы не используете каркасы, такие как Spring.

Вот пример, который я создал, который может дать вам представление: -

// think of this as an anonymous block of code you want to wrap with transaction
public abstract class CodeBlock {
    public abstract void execute();
}

// wraps transaction around the CodeBlock
public class TransactionWrapper {

    public boolean run(CodeBlock codeBlock) {
        PersistentTransaction t = null;
        boolean status = false;

        try {
            t = PersistentManager.instance().getSession().beginTransaction();

            codeBlock.execute();

            t.commit();
            status = true;
        }
        catch (Exception e) {
            e.printStackTrace();
            try {
                t.rollback();
            }
            catch (Exception ignored) {
            }
        }
        finally {
            // close session
        }

        return status;
    }
}

Тогда ваш метод DAO будет выглядеть так: -

TransactionWrapper  transactionWrapper  = new TransactionWrapper();

public String createObject() {
    boolean status = transactionWrapper.run(new CodeBlock() {
        @Override
        public void execute() {
            Foods f = new Foods();
            f.save();
        }
    });

    return status ? "everything allright" : "there was an error";
}
1 голос
/ 02 марта 2011

Сохранение будет происходить через сеанс, а не на объекте, если вы не внедрили сеанс в постоянный объект.

И наконец, и закройте сессию.

finally {
   //session.close()
}

Предложение: Если этот код был опубликован для целей обучения, то все в порядке, в противном случае я бы предложил использовать Spring для управления этим котломвещи и беспокоиться только о сохранении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...