что использовать, управляемые бобы (резервные бобы) или бобы сущностей?

Я вижу много примеров, отмечающих бобы как бобы сущностей (@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 это будет проверяться.