jsfentitybacking-beans

JPA Entity as JSF Bean?


Does it make sense to use Entities as JSF Backing Beans?

@Entity
@ManagedBean
@ViewScoped
public class User {

    private String firstname;
    private String lastname;

    @EJB
    private UserService service;

    public void submit() {
        service.create(this);
    }

    // ...
}

Or is it better to keep them separately and transfer the data from the backing bean to the entity at the end?

@ManagedBean
@ViewScoped
public class UserBean {

    private String firstname;
    private String lastname;

    @EJB
    private UserService service;

    public void submit() {
        User user = new User();
        user.setFirstname(firstname);
        user.setLastname(lastname);
        service.create(user);
    }

    // ...
}

Solution

  • You could do so. It's technically possible. But it does (design)functionally not make any sense. You're basically tight-coupling the model with the controller. Usually the JPA entity (model) is a property of a JSF managed bean (controller). This keeps the code DRY. You don't want to duplicate the same properties over all place, let alone annotations on those such as bean validation constraints.

    E.g.

    @ManagedBean
    @ViewScoped
    public class Register {
    
        private User user;
    
        @EJB
        private UserService service;
    
        @PostConstruct
        public void init() { 
            user = new User();
        }
    
        public void submit() {
            service.create(user);
        }
    
        public User getUser() {
            return user;
        }
    
    }
    

    with this Facelets page (view):

    <h:form>
        <h:inputText value="#{register.user.email}" />
        <h:inputSecret value="#{register.user.password}" />
        <h:inputText value="#{register.user.firstname}" />
        <h:inputText value="#{register.user.lastname}" />
        ...
        <h:commandButton value="Register" action="#{register.submit}" />
    </h:form>
    

    See also: