что использовать, управляемые бобы (резервные бобы) или бобы сущностей?
Я вижу много примеров, отмечающих бобы как бобы сущностей (@Entity) и именованные бобы (CDI), чтобы избежать создания 2 классов (управляемые бобы и бобы сущностей), а также использовать проверку бобов, чтобы проверка могла выполняться как на клиенте, так и на сервере.
Итак, должен ли я использовать один класс или нет, есть ли какие-либо проблемы или у меня должны быть управляемые бобы или уровень сервиса, создающие бобы сущностей, используя данные из управляемых бобов ?
1 ответов
аннотации @Named или @ManagedBean обычно используются, чтобы позволить контейнеру bean (CDI/JSF) создать экземпляр bean по требованию, когда на него ссылается язык выражений в JSF.
для компонента @Entity часто не имеет смысла просто получать произвольный новый экземпляр. @ Entity очень сильно связан с постоянным идентификатором. Таким образом, такая сущность запрашивается из Entity Manager
, а не из контейнера для кофейных зерен.
типичная картина к имейте (тонкий) резервный компонент, который называется вызовом службы (который, в свою очередь, обычно @Stateless в Java EE). Затем служба возвращает сущности.
в некоторых очень тривиальных системах люди иногда делают службу с именем и, таким образом, непосредственно доступной для EL. Однако в конечном итоге вы часто хотите, чтобы "резервный код" генерировал сообщения лиц или обрабатывал (табличные) выборки, которые не должны быть проблемой чистой бизнес-службы.
другой общий ярлык позволяет резервному компоненту содержать бизнес-код напрямую (например, диспетчер сущностей, который извлекает сущности). Это затрудняет повторное использование бизнес-кода, но если приложение тривиально и нет необходимости в повторном использовании, вам может сойти это с рук.
но позволить сущности-быть-бэк-Бобу редко и анти-общим шаблонам Java EE.
просто обратите внимание, что резервный компонент может возвращать объект напрямую, поэтому bean-validation все еще может использоваться. Есть нет никакой необходимости в странном шаблоне "разброса/сбора", который подкрался давно (см. Второй пример в этот вопрос).
Э. Г.
@ViewScoped
@ManagedBean
public class BackingBean {
private SomeEntity myEntity; // + getter
@EJB
private Service service;
@PostConstruct
public void init() {
myEntity = service.getSomeEntity();
}
public void save() {
service.save(myEntity);
FacesContext.getCurrentInstance().addMessage(..., ...);
}
}
предполагая, что SomeEntity
в аннотированном Бобе @Entity проверка Боба теперь может использоваться на Фасетке, например:
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
>
<h:body>
<h:form>
<h:inputText value="#{backingBean.myEntity.name}" />
<h:commandButton value="Save" action="#{backingBean.save}" />
</h:form>
</h:body>
</html>
если есть ограничение на SomeEntity.name
это будет проверяться.