Что использовать, управляемый beans (поддержка beans) или entity beans?

Я вижу много примеров, обозначающих beans как объект beans (@Entity) и называемый beans (CDI), чтобы избежать создания 2 классов (управляемых bean и сущностей bean) и также использовать валидацию bean, чтобы проверка могла выполняться как на клиенте, так и на сервере.

Так что я должен использовать один класс или нет, есть ли какие-либо проблемы или мне нужно, чтобы мой управляемый beans или сервисный слой создавал сущность beans, используя данные из управляемого beans?

Ответы

Ответ 1

Аннотации @Named или @ManagedBean обычно используются для того, чтобы контейнер bean (CDI/JSF) создавал экземпляр bean по запросу при ссылке на язык выражения в JSF.

Для @Entity bean часто не так просто получить произвольный новый экземпляр. @Entity очень сильно связан с постоянной идентификацией. Такой объект запрашивается из Entity Manager, а не из контейнера bean.

Типичный шаблон состоит в том, чтобы иметь (slim) поддержку bean, которая назвала обращение к службе (которая, в свою очередь, обычно является @Stateless в Java EE). Затем служба возвращает объекты.

В некоторых очень тривиальных системах люди иногда делают сервис названным и, таким образом, напрямую доступным для EL. Тем не менее, в конечном итоге вы часто хотите, чтобы "код поддержки" генерировал сообщения лиц или дескриптор (таблицы), которые представляют собой все, что не должно заботиться о чистом бизнес-сервисе.

Другим распространенным ярлыком является то, что резервная копия bean содержит бизнес-код напрямую (например, менеджер объектов, который извлекает объекты). Это затрудняет повторное использование бизнес-кода, но если приложение тривиально, и нет необходимости в повторном использовании, вы можете с ним справиться.

Но предоставление сущности -be-backing bean является редкими и противоречит общим шаблонам Java EE.

Просто помните, что поддержка bean может возвращать объект напрямую, поэтому 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 bean, bean валидация теперь может использоваться на Facelet как:

<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, оно будет проверено.