JSF 2.0 и hibernate добавление новых объектов в базу данных postgresql - PullRequest
1 голос
/ 23 сентября 2010

Я пишу приложение JSF 2.0 с базой данных Hibernate и Postgresql. Моя проблема - плохое понимание того, как обрабатывать сеанс с Hibernate при вставке данных в несколько таблиц за раз. У меня есть метод savePerson. Метод вызывается столько раз, сколько адресов отправлено пользователем, но объект Person создается только один раз. Затем метод savePerson вызывает метод addAddress. Код выглядит так:

public Person savePerson(Person p, String address) {

        Transaction tx = null;
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();

        if (p == null) {
             = new Person();

            try {
                tx = session.beginTransaction();
                session.save(p);
                tx.commit();
            } catch (RuntimeException e) {
                if (tx != null && tx.isActive()) {
                    try {

                        tx.rollback();
                    } catch (HibernateException e1) {
                    }

                    throw e;
                }
            }
        }

        int id = p.getId();
        addAddress(4, id, address);

        return p;
    }

И метод addAddress:

public void addAddress(int table_id, int row_id, String address) {

        Transaction tx = null;
        session = HibernateUtil.getSessionFactory().openSession();
        Address a = new Address(table_id, row_id, address);

        try {
            tx = session.beginTransaction();
            session.save(a);
            tx.commit();
        } catch (RuntimeException e) {
            System.out.println("first try");

            if (tx != null && tx.isActive()) {
                System.out.println("first try if");
                try {
                    System.out.println("first try if try");

                    tx.rollback();
                } catch (HibernateException e1) {

                }
                // throw again the first exception
                throw e;
            }
            throw e;
        }

Но я получаю следующую ошибку:

org.hibernate.TransactionException: Transaction not successfully started

Итак, как правильно открывать и закрывать сеанс при вставке данных в несколько таблиц одновременно?

С наилучшими пожеланиями, дерзость.

Ответы [ 2 ]

1 голос
/ 23 сентября 2010

A TransactionException означает, что транзакция не может быть начата, зафиксирована или откатана .Но предоставление полной трассировки стека, вероятно, было бы полезно для полного понимания проблемы.

При этом, хотя вы можете создать несколько (последовательных) Transaction из одного Session, в вашем IMO есть серьезный недостатокдизайн.Если вам нужно вставить как Person, так и Address, вам, скорее всего, следует сделать это за одну единицу работы.При вашем текущем подходе добавление Address может дать сбой и оставить только что вставленный Person в несогласованном состоянии.

Итак, как правильно открывать и закрывать сеанс при вставке данных вболее одного стола одновременно?

Сделайте это за одну транзакцию.

И если вы хотите удалить управление транзакциями из ваших методов, вам следует рассмотреть возможность использования шаблона Open Session In View , как предложено BalusC .Если, конечно, вам не нужен более точный контроль транзакций.

Ресурсы

1 голос
/ 23 сентября 2010

Обычной практикой является создание Filter, который открывает сеанс Hibernate перед обработкой запроса / ответа, а также фиксирует и закрывает сеанс после обработки запроса / ответа. Наконец, сопоставьте это Filter с <servlet-name> из FacesServlet. Это называется Открыть сеанс в представлении или Открыть сеанс по запросу .

Spring предоставляет такой фильтр из коробки, OpenSessionInViewFilter, который полезен для случая, когда вы уже используете Spring или планируете использовать его. Если вы не хотите (не хотите) делать Spring, вы можете найти здесь еще один конкретный исходный пример, который вы можете просто скопировать, вставить и настроить / развернуть.

Другие методы перечислены в этом FAQ по MyFaces (хотя MyFaces 1.2 нацелена, это применимо к Mojarra 1.x и 2.x).

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