JPA Entity as JSF Bean?
Asked Answered
K

1

10

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);
    }

    // ...
}
Kaceykachina answered 24/4, 2012 at 15:44 Comment(0)
T
21

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:

Tutuila answered 24/4, 2012 at 15:50 Comment(4)
Thanks for the answer. I want to have a good design. Is your answer a sample of a good design or answer to my question or both? Which design would you suggest for a JSF JPA project as a GURU.:-)Kaceykachina
It's both. I would usually not answer/recommend wrong designs at all.Tutuila
Do u think that is a great idea to expose an Entity directly in Bean class?Paquin
This design is the simplest one, but it will hold references to the entityManager (at least with eclipselink), which in turn will hold the identityMap. How to deal with this?Guaco

© 2022 - 2024 — McMap. All rights reserved.