JPA Aufbau einer Webapplikation mit JEE

Todo

Aktives Mitglied
Hi, ich blick leider überhaupt nicht mehr durch, habe jetzt so viel gelesen, hat mich nur noch mehr verwirrt als geholfen.

Es soll jetzt eine Webapplikation werden mit JPA(EclipseLink) , JEE, JSF auf ein Glassfish Server.

Leider wurde uns im Studium nur gezeigt, wie man es mit Java Swing Applikation macht und nicht im Web Umfeld.

Also mal von Grund auf:
Habe in Netbeans eine Webapplikation erstellt mit JSF Framework.

Die benötigten Entity erstellt, JSF ManagedBean für die Verwaltung der Views.
Angenommen ein User wird erstellt.
Die Entity:
Java:
@Entity
@Table(name = "USERS")
@NamedQuery(name = "User.findUserByUsername", query = "select u from User u where u.username = :username")
public class User implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private static final long serialVersionUID = 1L;
    public static final String FIND_BY_USERNAME = "User.findUserByUsername";
    private String username;
    private String passwort;
    @Enumerated(EnumType.STRING)
    private Role rolle;
    public String getPasswort() {
        return passwort;
    }

    public void setPasswort(String passwort) {
        this.passwort = passwort;
    }

    public Role getRolle() {
        return rolle;
    }

    public void setRolle(Role rolle) {
        this.rolle = rolle;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public boolean isAdmin() {
        return Role.ADMIN.equals(this.rolle);
    }

    public boolean isOther() {
        return Role.OTHER.equals(this.rolle);
    }
    
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final User other = (User) obj;
        if (this.id != other.id && (this.id == null || !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public int hashCode() {
        int hash = 5;
        hash = 67 * hash + (this.id != null ? this.id.hashCode() : 0);
        return hash;
    }

    @Override
    public String toString() {
        return "User{" + "id=" + id + ", username=" + username + ", passwort=" + passwort + ", rolle=" + rolle + ", ablaufdatum=" + getAblaufdatum() + '}';
    }
}

So, die View erstellt mit Hilfe ein paar Eingabefelder und der ManagedBean ein fertigen User, wobei in der ManagedBean der User als Objekt vorliegt und alles ausgefüllt ist, ausser die ID, da diese generiert wird. So weit kein Problem, aber dann kommt jetzt woran es happert.

Normal wäre doch jetzt eine Stateless Sessionbean die die Businesslogik darstellt. DIese startet eine Transaktion und leitet das Objet weiter zu einer DAO oder liege ich falsch. Die DAO muss doch dann wiederrum keine Session Bean sein oder?

Netbeans kann so viel generieren, aber da ich es eigentlich lieber selber schreibe und ich nicht weiß, wofür man den JPAController brauch und wofür die Fassade würde ich es lieber einmal erklärrt haben also irgendein wirwarr an generieten Klassen dadrin zu haben.

Businesslogik:
Die bean leitet entweder das fertige Objekt aus der ManagedBean weiter zur DAO, oder falls verteilte Transaktion notwendig sind, statet diese eine UserTransaktion und ruft die gebrauchten Methoden auf aus der DAO??

Die DAO besorgt sich per depency injektion ein EntityManager und führt die Methoden auf.

Was wäre wenn im User Objekt der ManagedBean aus irgendein Grund ein parameter nicht drin ist?
Da ist auch noch ein großes Fragezeichen bei mir.

ManagedBean und Sessionbeans.
Immoment würde ich die ManagedBean immer für die View benutzen, die erstellt immer die Objekte die persitiert werden sollen, und diese leitet immer die erstellten Objekte zur Businessschicht weiter.

Ist es totaler Quatsch was ich hier erzähle?

Eine Erklärung und/oder ein Link zum richtigen einlesen wie es gegliedert werden muss wäre sehr sehr nett. Danke euch.
 

Todo

Aktives Mitglied
Immoment sieht die DAO so aus:

Die abstractDAO
Java:
public abstract class AbstractDAO<T> {

    private Class<T> entityClass;

    public AbstractDAO(Class<T> entityClass) {
        this.entityClass = entityClass;
    }

    protected abstract EntityManager getEntityManager();

    public void create(T entity) {
        getEntityManager().persist(entity);
    }

    public void edit(T entity) {
        getEntityManager().merge(entity);
    }

    public void remove(T entity) {
        getEntityManager().remove(getEntityManager().merge(entity));
    }

    public T find(Object id) {
        return getEntityManager().find(entityClass, id);
    }

    public List<T> findAll() {
        javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
        cq.select(cq.from(entityClass));
        return getEntityManager().createQuery(cq).getResultList();
    }

    public List<T> findRange(int[] range) {
        javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
        cq.select(cq.from(entityClass));
        javax.persistence.Query q = getEntityManager().createQuery(cq);
        q.setMaxResults(range[1] - range[0]);
        q.setFirstResult(range[0]);
        return q.getResultList();
    }

    public int count() {
        javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
        javax.persistence.criteria.Root<T> rt = cq.from(entityClass);
        cq.select(getEntityManager().getCriteriaBuilder().count(rt));
        javax.persistence.Query q = getEntityManager().createQuery(cq);
        return ((Long) q.getSingleResult()).intValue();
    }

    protected List<T> findResult(String namedQuery, Map<String, Object> parameters) {
        List<T> result = null;

        try {
            Query query = getEntityManager().createNamedQuery(namedQuery);

            if (parameters != null && !parameters.isEmpty()) {
                populateQueryParameters(query, parameters);
            }

            result = query.getResultList();

        } catch (NoResultException e) {
            System.out.println("No result found for named query: " + namedQuery);
        } catch (Exception e) {
            System.out.println("Error while running query: " + e.getMessage());
            e.printStackTrace();
        }

        return result;
    }

    @SuppressWarnings("unchecked")
    protected T findOneResult(String namedQuery, Map<String, Object> parameters) {
        T result = null;

        try {
            Query query = getEntityManager().createNamedQuery(namedQuery);

            if (parameters != null && !parameters.isEmpty()) {
                populateQueryParameters(query, parameters);
            }

            result = (T) query.getSingleResult();

        } catch (NoResultException e) {
            System.out.println("No result found for named query: " + namedQuery);
        } catch (Exception e) {
            System.out.println("Error while running query: " + e.getMessage());
            e.printStackTrace();
        }

        return result;
    }

    private void populateQueryParameters(Query query, Map<String, Object> parameters) {
        for (Map.Entry<String, Object> entry : parameters.entrySet()) {
            query.setParameter(entry.getKey(), entry.getValue());
        }
    }
}

Und die implementierte DAO
Java:
public class UserDAO extends AbstractDAO<User> {
    @PersistenceContext(unitName = "BlauarbeitPrimefaces")
    private EntityManager em;

    @Override
    protected EntityManager getEntityManager() {
        return em;
    }

    public UserDAO() {
        super(User.class);
    }
    
}

Davon gibt es dann mehere für jede Entity eine....

Jetzt würde ich eine Fassade implementieren die entweder die Objekte von der ManagedBean persitiert oder aber eine UserTransaktion startet und dann die Objekte persitieren...

Wäre das so ok bzw. richtig?
 
Zuletzt bearbeitet:
S

Sym

Gast
Ich weiß nicht, wofür Du noch ein DAO benötigst. Das ist in einer JEE-Umgebung auch nicht mehr notwendig.

Nimm eine EJB, injecte Dir dort denn EM und fertig ist die Maus. :)
 

Ähnliche Java Themen


Oben