# JPA mit JSF auf Tomcat



## TheCritter (10. Nov 2011)

Ich versuche seit Tagen eine Anwendung mit JPA und JSF 2.0 zum laufen zu bringen. Das Ganze soll auf einem Tomcat (ohne OpenEJB o.ä.) laufen. Was mache ich falsch?
Die meisten Beispiele im Internet haben folgende Zeile:

```
@PersistenceContext
private EntityManager em;
```
Dies ist ja aber nur mit Hilfe eines Application servers möglich, nicht aber mit Tomcat.

Dann habe ich ein Beispiel gefunden das folgende Klasse hat und auf dem Tomcat läuft. Aber das bezieht sich wiederum auf Servlets, nciht auf JSF:


```
package guest;
 
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import javax.persistence.*;
 
public class GuestServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
 
    @Override
    protected void doGet(
        HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
 
        // Obtain a database connection:
        EntityManagerFactory emf =
           (EntityManagerFactory)getServletContext().getAttribute("emf");
        EntityManager em = emf.createEntityManager();
 
        try {
            // Handle a new guest (if any):
            String name = request.getParameter("name");
            if (name != null) {
                em.getTransaction().begin();
                em.persist(new Guest(name));
                em.getTransaction().commit();
            }
 
            // Display the list of guests:
            List<Guest> guestList = em.createQuery(
                "SELECT g FROM Guest g", Guest.class).getResultList();
            request.setAttribute("guests", guestList);
            request.getRequestDispatcher("/guest.jsp")
                .forward(request, response);
 
        } finally {
            // Close the database connection:
            if (em.getTransaction().isActive())
                em.getTransaction().rollback();
            em.close();
        }
    }
 
    @Override
    protected void doPost(
        HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }
}
```
Bzw ist hier das komplette Beispiel:
JPA Database Web Application Tutorial (Tomcat, Servlet, JSP)

Wie vereine ich diese 3 Sachen? Tomcat, JPA und JSF?


----------



## maki (10. Nov 2011)

> Was mache ich falsch?


IMHO ein paar Dinge.

Aber als erstes fällt mir auf, dass du ein nicht-JSF Projekt mit JPA als Grundlage/Beispiel für ein geplantes JSF Projekt mit JPA hernehmen willst..

Es gibt mehr als genug Beispiele wie man JSF & JPA kombiniert (Google hilft beim finden), wieso nicht eines davon nehmen?


----------



## Deadalus (10. Nov 2011)

TheCritter hat gesagt.:


> Wie vereine ich diese 3 Sachen? Tomcat, JPA und JSF?



-> Apache TomEE

Ok da bekommst du noch ein bischen mehr dazu, aber es zwingt dich ja niemand es zu benutzen. Gut wenns nur darum geht dir unnötig Stress zu machen löst das natürlich nicht dein Problem ;-)


----------



## TheCritter (10. Nov 2011)

maki hat gesagt.:


> IMHO ein paar Dinge.
> 
> Aber als erstes fällt mir auf, dass du ein nicht-JSF Projekt mit JPA als Grundlage/Beispiel für ein geplantes JSF Projekt mit JPA hernehmen willst..
> 
> Es gibt mehr als genug Beispiele wie man JSF & JPA kombiniert (Google hilft beim finden), wieso nicht eines davon nehmen?



Du hast mich nicht ganz verstanden. Das ist ja das Problem dass ich keine Beispiele in der Richtung finde. Es gibt alle möglichen Kombinationen, aber nicht alle 3 vereint. Glaube mir, ich google schon seit Tagen nach so einen Beispiel. Wäre das so einfach, so hätte ich hier nicht geschrieben.

Zu TomEE, ist das wirklich die einzige Möglichkeit für JPA auf Tomcat oder ist das "nur" die bequemste?


----------



## Deadalus (10. Nov 2011)

Was versprichst du dir denn bitte von dieser Combi. Warum willst du krampfhaft einen sinnvollen Standard also das JEE 6 Web Profile zerpflücken? 

Möglich ist das auf jeden Fall. Es gibt nur keinen einzigen Vorteil aber dafür einen Haufen Nachteile. 

Hier trotzdem die 2 Zeilen code die du benötigst um einen EntityManager zu bekommen: 


```
EntityManagerFactory factory = Persistence.createEntityManagerFactory("NameOfYourPersistenceUnit");
EntityManager entityManager =  factory.createEntityManager();
```


Hier noch ein hübsches Zitat von der TomEE Seite: 


> In Apache TomEE's previous life, it was simply known as the OpenEJB+Tomcat integration. That description was always quite misleading. For one, there's incredible benefit even if EJB is never used.
> 
> Quite simply, EJB as a technology integrates with the most number of specs than any other spec. It touches JMS, Web Services, Connectors, Servlets (EJB Web Services are still driven by Servlets!), JPA, JDBC, Transactions, Security. Integrating with all these technologies takes time and expertise and in the end has very little to do with EJB specifically. To apply this all to Tomcat and leverage it all from a simple Servlet is a natural extension and the reason most app servers started out as EJB servers.
> 
> ...


----------



## TheCritter (10. Nov 2011)

Der Sinn ist der, dass die Anwendung auf einem Firmenserver laufen soll wo nur Tomcat installiert ist, dieser über das Autoupdate weiterhin upgedated werden soll und nicht noch ein Java Server darauf installiert werden soll. Wäre das für mich privat, so wäre ich da natürlich flexibler ;-)

Ok, danke für die Codezeilen. Ich probiere das mal so aus.


----------



## maki (10. Nov 2011)

TheCritter hat gesagt.:


> Du hast mich nicht ganz verstanden. Das ist ja das Problem dass ich keine Beispiele in der Richtung finde. Es gibt alle möglichen Kombinationen, aber nicht alle 3 vereint. Glaube mir, ich google schon seit Tagen nach so einen Beispiel. Wäre das so einfach, so hätte ich hier nicht geschrieben.


Ich habe dich sehr gut verstanden.
Glauben kann ich dir nicht, weil ich es besser weiss 

Example: Web Application (JSF) Using JPA
EclipseLink/Examples/JPA/JSF Tutorial - Eclipsepedia

Der Grund warum die meisten (aber eben nicht alle) JPA+JSF Tutorials auch EBJs (SessionBeans) oder Spring einsetzen, ist nunmal dass es einfacher ist JSF + JPA mit JEE oder Spring zu nutzen.

Wenn es also nur der Wald & Wiesen Tomcat sein darf, dann würde ich dir eben zusätzlich Spring oder OpenEJB empfehlen.


----------



## TheCritter (10. Nov 2011)

Ok danke, bei dem 2 Link ist einiger brauchbarer Code dabei. Ich werde erstmal testen.

Eegen Spring, ok ich hatte mich mal mit Seam beschäftigt. Das bekam ich aber auch nicht auf dem Tomcat zum laufen. Nur auf dem JBoss. Habe daher Seam erstmal auf die "Warteposition" gesetzt und will mich später damit beschäftigen.

Wie gesagt, ich probiere erstmal noch etwas herum und ggf muss ich doch die Verantworklichen überzeugen einen Application Server oder TomEE aufzusetzen.


----------



## TheCritter (10. Nov 2011)

Da es jetzt auch ohne OpenEJB funktioniert kann ich erstmal weiter arbeiten. Danke für die Tipps und ich schließe jetzt das Thema.


----------



## gman (10. Nov 2011)

Hi,

vielleicht noch als Ergänzung:

Wenn du Maven einsetzt könntest du mal das JSF-2.0-Artefakt von Apache MyFaces testen. Die
nutzen dabei alle Apache-Komponenten für die Entwicklung mit JSF und JPA. Das Artefakt
erzeugt eine einfache Beispielanwendung und läuft auf einem normalen Tomcat.

Group ID:      org.apache.myfaces.buildtools
Artifact ID:    myfaces-archetype-codi-jsf20


----------

