Проблема в том, что каждый раз, когда я удаляю строку в таблице, транзакция фиксируется без какого-либо контроля, оставленного пользователю.
Это звучит странно.Если вы редактируете данные в таблице данных и отправляете обратно эти изменения (через AJAX или напрямую) И данные исходят из bean-компонента без сохранения состояния, то это не может быть ничем иным, кроме того, что вы работаете с отсоединенными сущностями.
Изменения тех объектов или списка, который их содержит, не отражаются автоматически в базе данных.В этом случае не существует понятия транзакции, которая автоматически фиксируется.Я решительно не согласен с ответом, данным Наяном выше.Да, пользовательские транзакции позволяют вам контролировать фиксацию, но это, похоже, не является вашей проблемой.
Хотя вам, возможно, следует показать некоторый код, я предполагаю, что вы просто вызываете метод deleteчто-то вроде вашей EJB-службы после каждого действия по удалению от пользователя, а затем ожидание того, что та же самая транзакция и постоянный контекст будут все еще там.Но в bean-компоненте без состояния они исчезают, как только вы выходите из метода, который в первую очередь дает вам сущности.
Ваша лучшая стратегия - позволить действиям пользователя работать только с данными, которые кэшируются@ViewScoped
поддерживающий боб.Тогда, если и только если пользователь подтверждает действие обновления, вы вызываете службу EJB со всеми измененными элементами за один раз.Если есть родительская сущность, которая имеет ссылку на список со всеми этими элементами, которые вы удалили, вам нужно только передать эту родительскую сущность и убедиться, что для отношения установлено каскадное удаление.
Тем не менее,есть поддержка паттерна, который, как вы думаете, вы уже получили.Этот шаблон включает в себя использование @Stateful
сессионного компонента и extended persistence context
.В этом случае контекст персистентности сессионного компонента будет кэшировать все ваши изменения, пока вы снова не свяжете его с транзакцией.Если вы выполняете свои действия удаления в нетранзакционном методе сессионного компонента и реализуете свой метод отмены также как нетранзакционный с @Remove
и entityManager.clear()
и методом сохранения как транзакционный метод @Remove (ненужно что-то делать в своем теле), тогда вы получите этот эффект.
Если вы не обладаете твердым пониманием EJB и транзакций, вам лучше всего выполнить первую стратегию.