Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Управление транзакциями БД в приложении


Автор: JustAStudent 12.1.2008, 13:47
Доброго времени суток.
В очередной раз надеюсь на помощь многоуважаемой публики smile 
Проблема в следующем: в java-приложении (для управления данными на сервере MySQL используется jdbc-драйвер) необходимо реализовать мульку сохранения и отката выполненых действий пользователя. Например, добавил юзер инфу по объекту, в приложении изменения отразились, а на сервере сохранились после команды "Сохранить" (или не сохранились при "Отмене").  Взаимодействие с БД происходит через объект java.sql.Connection
Как такое реализовать?

Автор: Platon 12.1.2008, 15:32
Ну, уж тут тебе однозначного ответа не будет. Это конечно, часто встречающаяся практика, но в жизни можно реализовать по-размому.
http://java.sun.com/blueprints/corej2eepatterns/Patterns/TransferObject.html
Может быть эта ссылка поможет? Сделай DTOManager, который ведет запись всех действий, по ходу оптимизируя запросы, к примеру:
object1.setValue1("Petr"), object1.setValue1("Peter") приведет к тому, что тебе необходимо будет выполнить только 1 запрос по обновлению строки, а не 2.

Автор: Platon 12.1.2008, 15:49
Вот я накидал чуток, сильно не бить, я с этим не сталкивался, но столкнуться скорее всего придется, вот и пробую. Ваши замечания предложения.

Код

package platon.memo;

import java.util.LinkedList;

public class TransactionMemo<E> {

    private LinkedList<E> addObjects = new LinkedList<E>();
    private LinkedList<E> removeObjects = new LinkedList<E>();
    private LinkedList<E> updateObjects = new LinkedList<E>();

    private DBManager manager;

    public void addObject(E obj) {
        addObjects.add(obj);
    }

    public void removeObject(E obj) {
        if (!addObjects.remove(obj))
            removeObjects.add(obj);
    }

    public void updateObject(E obj) {
        updateObjects.remove(obj);
        updateObjects.add(obj);
    }

    public void clear() {
        updateObjects.clear();
        removeObjects.clear();
        addObjects.clear();
    }

    public void rollback() {
        clear();
    }

    public void commit() {
        for (E e : addObjects)
            manager.save(e);
        for (E e : updateObjects)
            manager.update(e);
        for (E e : removeObjects)
            manager.remove(e);
    }
}



Добавлено через 8 минут и 44 секунды
Могу также предположить, что это есть в hibernate на уровне сессии. session.startTransaction(), session.getTransaction().commit(), session.getTransaction().rollback();

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)