Форум программистов, компьютерный форум, киберфорум
Java EE (J2EE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.66/32: Рейтинг темы: голосов - 32, средняя оценка - 4.66
0 / 0 / 2
Регистрация: 24.08.2008
Сообщений: 119

Транзакции в EJB

22.12.2008, 09:52. Показов 6736. Ответов 33
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
есть такой вот кусок кода.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
        try {
            Product product = EJBProperties.productHome.findByPrimaryKey(productId);
            Integer id = newId(EJBProperties.HOME_BUILD);
            build = EJBProperties.buildHome.create(id, buildNumber);
            build.setProduct(product);
            build.setBuildDate(buildDate);
            if (true) throw new Exception('some error here, blin');
        } catch (Exception e) {
            Utils.generalLogger.severe(e);
            Utils.generalLogger.severe('rolling back transaction...');
            sessionContext.setRollbackOnly();
            throw new CreateException('Exception while creating build (nr=' + buildNumber + '). ' + e);
        }
предполагается, что если в блоке try-catch произойдет что-то плохое, то транзация будет отменена (bean with container-managed transaction).
и действительно, транзакция почти полностью отменяется, т.е. поля productId & buildDate обнуляются (возвращаются в исходное состояние).
проблема в том, что созданный build не удаляется при откате. а хотелось бы, чтобы откатилось ВСЕ - и созданный 'недоделанный' build был бы удален тоже.
есть ли более элегантные решения, чем говорить вручную build.remove?
(Product, Build - entity ejbs (CMP), сам код исполняется в session EJB)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.12.2008, 09:52
Ответы с готовыми решениями:

EJB: если в таблице БД задано каскадное удаление, то в ejb-jar.xml тоже надо его указывать?
Если в базе есть таблица, у которой для одного из полей, которое является foreign key, прописано ON DELETE CASCADE, то в ejb-jar.xml тоже...

Microsofr VJ ++6 - EJB
Привет всем! Не подскажете, как из класса, работающего под Microsoft JVM, обращаться к EJB, исполнящемуся, например, на JBoss 3. Дело...

EJB и JPA
Здравствуйте, может поможете советом. Мне нужно реализовать клиент серверное приложение с базой. Вопросы касательно сервера. Мне нужно...

33
4 / 4 / 4
Регистрация: 28.08.2008
Сообщений: 611
22.12.2008, 12:12
Студворк — интернет-сервис помощи студентам
>почему откатывается часть изменений, связанная с выставлением полей нового объекта... почему он не удаляется?

Имеем дело с новым экземпляром CMP. Контейнер сам кеширует его состояние и восстанавливает его, если транзакция откатывается. До того, как бин создан, он не участвует в транзакции, у него нет состояние. Это значит, что процесс создания/удаления управлется не созданным CMP бином. То, что программист делает в Session для кеширования состояния и отката транзакций, контейнер в CMP автоматизирует.

>я почему-то всю жизнь транзакции понимал так...

Мы не про СУБД говорим.
0
0 / 0 / 2
Регистрация: 24.08.2008
Сообщений: 119
22.12.2008, 12:48  [ТС]
во по поводу этого:
'Имея это в виду, можно реализовать SessionSynchronization.beforeCompletion( ) и там либо оставлять все, как есть, либо вручноую откатывать транзакцию -- читай, восстанавливать состоние (state) бина.'

можно поподробнее? как это можно в моем случае использовать?
(на всякий случай напомню - в моем Session bean - CM-transactions)
0
4 / 4 / 4
Регистрация: 28.08.2008
Сообщений: 611
22.12.2008, 13:09
>на всякий случай напомню - в моем Session bean - CM-transactions

Само собой, так как в BM-trans нельзя использовать setRollbackInly()
:-)

Интерфейс SessionSynchronization может реализовывать только Statefull Session beans with BM transaction. Класс реализации бина (реализующий javax.ejb.SessionBean) может реализовывать интерфейс SessionSynchronization. Если он его реализовывает, то контейнер вызывает объявленные в этом интерфейсе операции.

Операция afterBegin() вызывается при открытии транзакции: после вызова клиентом операции бина и до вызова контейнером реализации вызванной клиентом операции.

Операция beforeCompletion() вызывается непосредственно перед закрытием транзакции (как откатанной, так и подтвержденной): после возврата управления из метода бина контейнеру и перед возвратом управления контейнером клинту.

Операция afterCompletion(boolean committed) вызывается после того как транзакция закрыта. Вызывается после вызова beforeCompletion() перед возвратом управления клиенту.

В твоем случае скорее всего нужно использовать afterBegin() и beforeCompletion(). Можно придумать свой класс-состояние бина. После afterBegin() создать новый объект-состояние, и класть туда, например, созданный CMP. При вызове beforeCompletion() проверяем, помечена транзакция для отката или нет. Если да, то изменения, сделанные с состоянием (они хранятся в объекте-состоянии), откатываем.
0
4 / 4 / 4
Регистрация: 28.08.2008
Сообщений: 611
22.12.2008, 13:10
Описался. Интерфейс SessionSynchronization может реализовывать только Statefull Session beans with CM transaction.
0
0 / 0 / 2
Регистрация: 24.08.2008
Сообщений: 119
22.12.2008, 13:27  [ТС]
вот сейчас для интереса попробовал с bean-managed transactions.
указал, что мой session bean использует BM-transaction.
поменял код соответственно:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
        Build build;
        UserTransaction ut = sessionContext.getUserTransaction();
 
        try {
            ut.begin();
            Product product = EJBProperties.productHome.findByPrimaryKey(productId);
            Integer id = newId(EJBProperties.HOME_BUILD);
            build = EJBProperties.buildHome.create(id, buildNumber);
            build.setProduct(product);
            build.setBuildDate(buildDate);
            if (true) throw new Exception('some error here, blin');
            ut.commit();
        } catch (Exception e) {
            Utils.generalLogger.severe(e);
            Utils.generalLogger.severe('BMT: rolling back transaction...');
//            sessionContext.setRollbackOnly();
            try {
                ut.rollback();
            } catch (SystemException ex) {
                Utils.generalLogger.severe('Rollback failed: ' + ex);
                ex.printStackTrace();
            }
            throw new CreateException('Exception while creating build (nr=' + buildNumber + '). ' + e);
        }
 
        return build;
результат тот же - 'build' остается в БД после rollback()
0
4 / 4 / 4
Регистрация: 28.08.2008
Сообщений: 611
22.12.2008, 13:37
Естественно. С точки зрения созданного CMP и записи, ему соответсвующей, транзакция началась ПОСЛЕ того, как этот CMP создан. Поэтому, откатывая транзакцию, он восстанавливает состояние в такое, что было на начало транзакции. А с точки зрения CMP, повторюсь, транакция началась ПОСЛЕ его создания.

Созданный новый CMP -- изменение в состоянии Session бина, он и должен убить созданный CMP, откатывая транзакцию.
0
0 / 0 / 2
Регистрация: 24.08.2008
Сообщений: 119
22.12.2008, 13:45  [ТС]
ммм... похоже, я чего-то главного не понимаю. вот эта фраза:
'Естественно. С точки зрения созданного CMP и записи, ему соответсвующей, транзакция началась ПОСЛЕ того, как этот CMP создан. '

я пишу:
transaction.begin
build=somehome.create()
...
transaction.rollback

как эта фраза соотносится с этим вот кодом? транзакция относится ведь не к понятию 'build', а ко всему методу. то есть я вот полагал, что и откатиться должны ВСЕ изменения в EJB,которые этот метод породил (ну и изменения через JDBC, если правильно получали datasource, конечно)
0
0 / 0 / 2
Регистрация: 24.08.2008
Сообщений: 119
22.12.2008, 13:49  [ТС]
и кстати, если я делаю так:
Java
1
2
3
4
5
6
7
8
9
10
    public void deleteBuild(java.lang.Integer buildId) throws RemoveException {
        try {
            Build build = EJBProperties.buildHome.findByPrimaryKey(buildId);
            build.remove();
            sessionContext.setRollbackOnly();
            throw new RemoveException('I don't want to delete it. =:-)');
        } catch (FinderException e){
            throw new RemoveException('can't delete Build: build not found with id=' + buildId);
        }
    }
то билд на самом деле удаляется, и никакой rollback его не спасает. ох...
0
4 / 4 / 4
Регистрация: 28.08.2008
Сообщений: 611
22.12.2008, 13:55
Нажал esc, и браузер мою поэму съел. БЛИН.

Кажется, понял, где пробоина.

Дело в том, что менеджер транзакций не занимается откатом или подтверждением транзакций. Он управляет контекстом транзакций: учитывает объекты, вовлеченные в транзакцию, уведомляет их, производит различные проверки и т. д. Откатом и подтверждением занимаются сами бины.

В методе Session бина открывается транзакция, в которую вливается созданный CMP. Так как при откате транзакции менеджер транзакций уведомляет каждый объект, вовлеченный в транзакцию, то уведомляется и созданный CMP.

Понятно или глубже писать?
0
0 / 0 / 2
Регистрация: 24.08.2008
Сообщений: 119
22.12.2008, 13:58  [ТС]
ок, пусть уведомляется созданный бин. так как это entity bean ('build'), то у него CM-transaction. то есть он сам должен откатиться назад. так? тогда в чем проблема? почему он сам не удаляется?
давай глубже пиши
0
4 / 4 / 4
Регистрация: 28.08.2008
Сообщений: 611
22.12.2008, 14:00
В сессионных бинах нет доброго дяди, который все сам знает, как в СУБД или в CMP. В CMP есть этот добрый дядя, но он за пределы изменений в этом CMP не выходит. А если нет записи, нет и CMP. А нет CMP, нет дядя для этого CMP.
0
0 / 0 / 2
Регистрация: 24.08.2008
Сообщений: 119
22.12.2008, 14:06  [ТС]
так, ладно, допустим, это можно считать ответом на вопрос 'кто виноват', поставленный в начале топика, хотя я вот раньше немного по-другому схему transactions в EJB представлял. все может быть, наша группа EJB не занимается, так что это мои собственные исследования были.
теперь другой вопрос - что делать, собственно?
пока пришлось сделать build.remove в блоке catch и все.
но ведь это же порнография какая-то. получается, что во всех подобных методах, которых в классе SphereDataManager весьма много, надо следить, где чего создается, и вручную удалять? мдааааааа.... транзакции, панимаишь....
0
4 / 4 / 4
Регистрация: 28.08.2008
Сообщений: 611
22.12.2008, 14:07
До того, как бин не создан, нет и его состояния. Состояние появляется, когда создается бин (а он, как известно, создается вмместе с записью). Состояние можно сфотографировать только после того, как объект создан.

Ты создал бин, он влился в транзакцию, он же сфотографировал свое состояние. Откатывая транзакцию, он возмет и восстановит сфотографированное состояние. Что такм будет??? То, что было сразу непосредственно после создания и вливания в транзакцию. То есть бин уже был создан.

Убить CMP -- задача не CMP -- твоя задача. Твой Session должен убить его.

Термин.
Состоние -- совокупность значений отрибутов объекта. Атрибут объекта -- читай его поле данных.
0
4 / 4 / 4
Регистрация: 28.08.2008
Сообщений: 611
22.12.2008, 14:09
Паттерн состояние знаешь? Твой случай.
И используй beforeCompletion().
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.12.2008, 14:09

Сортировка EJB
допустим, мне надо иметь отсортированный по определенным критериям список объектов (entity beans). вопрос - как это принято делать? ...

Книги EJB
Форумчани, нужен совет! Мне нужно разобраться с EJB! Хотел бы услышать совет достойной книги, желательно на русском, но если нет, то на...

Не собирается ejb
вот лог

EJB и WEB модули
У WEB модуле у меня сервлет, вспомогательный класс для сервлета, фильтры, страницы JSP, теги и тегхендлеры. Вроде структура WEB модуля не...

Ejb hibernate mysql
На JSF странице выводится таблица из базы MySql Если страница не активна гдето минуту выводится такая ошибка ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
34
Ответ Создать тему
Новые блоги и статьи
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru