Java EE — управление сущностями в графическом интерфейсе

Я использую JPA с JTA в корпоративном приложении Java EE, включая ejb и веб-модуль, который включает управляемые компоненты, связанные с веб-страницами.

Управляемые компоненты должны иметь возможность извлекать объекты из базы данных с помощью методов, предлагаемых моими ejbs.

У меня есть объект User, представляющий данные пользователей, зарегистрированных в системе, и я хочу разрешить пользователю изменять свою электронную почту, пароль и некоторые другие настройки.

Например, давайте рассмотрим эту сущность (абстрагированную от всех факторов, которые здесь не имеют влияния):

@Entity
public class User {
..........
    private string email;
    *getter and setter for email*
    private string city;
    *getter and setter for city*
..........
}

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

например, у меня может быть в Index.xhtml

<someEditableTag>#{myBean.user.email}</someEditableTag>
<someEditableTag>#{myBean.user.city}</someEditableTag>
<someButton>#{myBean.user.confirm()}</someButton>

В моем бобе тогда:

@Managed
@RequestScoped
public class myBean {
..........
   private user;
   public getUser() {
     if(user == null)
       user = someEJB.getLoggedUser(); // Retrieve from DB the user entity associated to logged user
     return user;
   }
   public void confirm() {
   // Call some ejb method to update the settings of the user in the database with the new data on the page
   }
..........
} 

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

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

Я многого не знаю об этих инструментах, поэтому я хотел бы узнать ваше мнение об этом сомнении, о котором я только что упомянул.

Я думал о некоторых решениях, таких как, например, отсоединение объектов в ejbs перед передачей их управляемым компонентам, но это не похоже на хорошее решение. Я хотел бы знать, каков стандартный шаблон проектирования для такого рода проблем. Любой пример решения будет работать нормально.

Любая помощь приветствуется, заранее спасибо


person sofask    schedule 16.01.2015    source источник


Ответы (1)


Пока вы не будете выполнять merge или insert метод из EntityManager на ваша сущность, ничего не должно происходить в БД. Вы всегда можете обновить свой объект с помощью EntityManager. Однако, если вы боитесь использовать объект в своей веб-шине, вы всегда можете использовать шаблон DTO.

person Szarpul    schedule 16.01.2015
comment
Спасибо за ваш ответ, я проверю, подходит ли шаблон DTO для моих целей. Что касается первой части вашего ответа, почему это должно работать именно так? Я имею в виду, что в одном из моих тестов у меня был один управляемый bean-компонент, называемый методом ejb без сохранения состояния, который использует установщик управляемого объекта, уже находящегося в базе данных, без вызова слияния из EntityManager. Как только метод ejb завершает работу, изменения фактически фиксируются в базе данных. Означает ли это, что для bean-компонента без состояния изменения объекта автоматически фиксируются, но не для Managed, RequestScoped? - person sofask; 16.01.2015
comment
Я не эксперт, но я думаю, что вызов установщика объекта в JSF ManagedBean и EJB bean - это другая проблема. Они EJB работают в другом контейнере, а затем в управляемом компоненте JSF. Каждая операция в EJB, если не происходит ничего особенного, например RuntimeException (поскольку ваш менеджер транзакций в файле persistance.xml установлен на JTA), заканчивается фиксацией в БД. Однако JSF ManagedBean не имеет такого поведения. - person Szarpul; 16.01.2015
comment
Отлично, это действительно решит мою проблему, я полагаю. У вас есть ссылка, где я могу прочитать об этом поведении? Спасибо за помощь - person sofask; 16.01.2015
comment
У меня нет конкретных ссылок, но почитайте про EJB Container (например, в Wiki). Также вы можете начать с этого docs.oracle.com/javaee/6/ учебник/doc/bnabo.html - person Szarpul; 16.01.2015
comment
Я на самом деле читал это прямо сейчас, большое спасибо за вашу помощь! - person sofask; 17.01.2015
comment
Между прочим, следствием использования этого факта (что позволяет управляемым компонентам получать доступ к установщикам моих управляемых объектов) является то, что каждый раз, когда мне нужно использовать свои объекты (потенциально измененные управляемыми компонентами, даже если изменение не было commit) Мне нужно обновить их, чтобы предотвратить утечку этих изменений. Правильно? - person sofask; 17.01.2015
comment
Что вы имеете в виду под утечкой? - person Szarpul; 17.01.2015
comment
Я опишу пример. Предположим, что какой-то управляемый компонент выполняет некоторые изменения в управляемом объекте, полученном с помощью метода ejb. Эти изменения выполняются с помощью сеттеров сущности, но слияния не происходит, поэтому они не фиксируются. В любом случае объект в контексте постоянства должен по-прежнему иметь отредактированные данные, если обновление не выполняется. Через некоторое время вызывается другой метод ejb. Этот метод редактирует и сохраняет некоторые поля этой сущности, которые мы ранее изменили. Если перед этим не будет выполнено обновление, в сохраненном объекте также будут данные, отредактированные управляемым компонентом. Это правильно? - person sofask; 17.01.2015
comment
да, я понимаю, что вы имеете в виду, что как только измененная сущность попадет в ejb, ее изменения будут зафиксированы? Я не знаю, произойдет ли это (поскольку изменение не произошло в ejb, но вы должны проверить это сами), но я не думаю, что вам следует переходить к измененному объекту ejb, если вы не хотите его обновлять. Обычно у вас должны быть методы ejb, такие как changeSomeProperty с идентификатором сущности, которую вы хотите изменить, и значением, которое нужно изменить. Возможно, вам поможет эта статья: palkonyves.blogspot.com/2013/03/ - person Szarpul; 17.01.2015
comment
Статья была действительно полезной в сочетании с тем, что вы ранее объяснили. Я провел некоторое тестирование и могу подтвердить, что когда управляемый компонент извлекает с помощью метода ejb объект из контекста постоянства, этот объект на самом деле вообще больше не управляется. Я предполагаю, что отсоединение происходит сразу, когда объект выходит из контейнера ejb. Это полностью решает мои потенциальные проблемы. Большое спасибо за вашу помощь, это было очень полезно! - person sofask; 17.01.2015