JSF2 + EJB3 + CRUD с пользовательским элементом управления для фиксации или отката? - PullRequest
2 голосов
/ 13 марта 2012

Я разрабатываю приложение Java EE на основе JSF2 и Glassfish 3.1.Приложение должно предоставлять CRUD-операции над таблицей базы данных.Данные таблицы базы данных отображаются с использованием простой таблицы данных с поведением редактирования incell.Я хотел бы позволить пользователю

  • изменять, добавлять и удалять элементы в таблице и
  • фиксировать только тогда, когда пользователь уверен в своих изменениях (нажатием командной кнопки) *Откат 1006 *
  • , когда пользователь хочет отменить свои изменения

Таблица имеет сущность, а EJB без состояния заботится об интерфейсах с entityManager для доступа к базе данных.

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

Как я могу реализовать этот вид пользовательского контроля над коммитами / откатами?

Ответы [ 2 ]

3 голосов
/ 18 марта 2012

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

Это звучит странно.Если вы редактируете данные в таблице данных и отправляете обратно эти изменения (через AJAX или напрямую) И данные исходят из bean-компонента без сохранения состояния, то это не может быть ничем иным, кроме того, что вы работаете с отсоединенными сущностями.

Изменения тех объектов или списка, который их содержит, не отражаются автоматически в базе данных.В этом случае не существует понятия транзакции, которая автоматически фиксируется.Я решительно не согласен с ответом, данным Наяном выше.Да, пользовательские транзакции позволяют вам контролировать фиксацию, но это, похоже, не является вашей проблемой.

Хотя вам, возможно, следует показать некоторый код, я предполагаю, что вы просто вызываете метод deleteчто-то вроде вашей EJB-службы после каждого действия по удалению от пользователя, а затем ожидание того, что та же самая транзакция и постоянный контекст будут все еще там.Но в bean-компоненте без состояния они исчезают, как только вы выходите из метода, который в первую очередь дает вам сущности.

Ваша лучшая стратегия - позволить действиям пользователя работать только с данными, которые кэшируются@ViewScoped поддерживающий боб.Тогда, если и только если пользователь подтверждает действие обновления, вы вызываете службу EJB со всеми измененными элементами за один раз.Если есть родительская сущность, которая имеет ссылку на список со всеми этими элементами, которые вы удалили, вам нужно только передать эту родительскую сущность и убедиться, что для отношения установлено каскадное удаление.

Тем не менее,есть поддержка паттерна, который, как вы думаете, вы уже получили.Этот шаблон включает в себя использование @Stateful сессионного компонента и extended persistence context.В этом случае контекст персистентности сессионного компонента будет кэшировать все ваши изменения, пока вы снова не свяжете его с транзакцией.Если вы выполняете свои действия удаления в нетранзакционном методе сессионного компонента и реализуете свой метод отмены также как нетранзакционный с @Remove и entityManager.clear() и методом сохранения как транзакционный метод @Remove (ненужно что-то делать в своем теле), тогда вы получите этот эффект.

Если вы не обладаете твердым пониманием EJB и транзакций, вам лучше всего выполнить первую стратегию.

0 голосов
/ 13 марта 2012

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

Изменения должны быть внесены в копию объекта или клона и позволить пользователю работать с ним. Когда пользователь хочет сохранить изменения, вы можете сохранить измененную копию. Если изменения должны быть отменены, то исходное состояние может быть восстановлено из исходного объекта.

Для вашего текущего подхода:

Проблема в том, что каждый раз, когда я удаляю строку в таблице, транзакция совершается без какого-либо контроля, оставленного пользователю.

Это потому, что режим сброса по умолчанию - FlushModeType.AUTO, вы можете изменить его на FlushModeType.COMMIT.

Как я могу реализовать этот вид пользовательского контроля над коммитами / откатами?

С помощью управляемой компонентом транзакции с использованием интерфейса UserTransaction вы можете контролировать начало транзакции, принятие, откат и т. Д.


Редактировать: В соответствии с JSR-317, управляемый объект может быть сохранен в базе данных сразу или позже - зависит от реализации .

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

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