# Injected EntityManager und EntityManagerFactory ist null



## homer3 (21. Okt 2009)

Hi,

ich versuche gerae meine ersten Schritte mit JPA. Ich habe problemlos mit Netbeans 6.7.1 ein Entity angelegt, eine PersistenceUnit, und eine DataSource zu MySQL. Nun wollte ich per EntityManager speichern, aber sowohl

```
@PersistenceUnit(unitName = "JavaEE-Test-ejbPU")
    private EntityManagerFactory emf;
```
als auch

```
@PersistenceContext(unitName = "JavaEE-Test-ejbPU")
    private EntityManager em;
```
bringen mir nur null. Als AppServer verwende ich Glassfish 2. Woran kann dies liegen?

Die von Netbeans generierte persistence.xml:

```
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" 
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
          xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
  <persistence-unit name="JavaEE-Test-ejbPU" transaction-type="JTA">
    <jta-data-source>jdbc/hellobean</jta-data-source>
    <properties>
      <property name="toplink.ddl-generation" value="create-tables"/>
    </properties>
  </persistence-unit>
</persistence>
```

Die Tabellen in der Datenbank werden automatisch angelegt, also scheint doch die Kommunikation mit der DB zu funktionieren. Würde mich freuen wenn mir wer helfen könnte 

Grüße


----------



## JanHH (22. Okt 2009)

EntityManagerFactory factory=Persistence.createEntityManagerFactory("JavaEE-Test-ejbPU");

?


----------



## mvitz (22. Okt 2009)

Es ist halt die Frage, ob es sich um eine JavaEE oder um eine JavaSE Umgebung handelt.


----------



## homer3 (22. Okt 2009)

Danke so geht es... 

Es handelt um JavaEE, ich dachte das ist klar wenn ich schreibe ich nutze nen ApplicationServer (Glassfish) ?

Mich würde nur noch interessieren wieso denn die Annotations nicht gehen, hat da jemand eine Idee?


----------



## mvitz (22. Okt 2009)

Oh sry ^^ das mit dem Glassfish hatte ich überlesen. Wo genau injezierst du denn? In einem Servlet oder in einer EJB?


----------



## homer3 (22. Okt 2009)

Ziel war es den von Netbeans generierten JPAController zu nutzen:


```
public class VisitorJpaController {

    @Resource
    private UserTransaction utx;
    @PersistenceUnit(unitName = "JavaEE-Test-ejbPU")
    private EntityManagerFactory emf;
...
```

Aber sowohl utx als auch emf sind hierbei dann null. Aufgerufen wird dieser von einer SessionBean. Danach habe ich versucht emf direkt in der SessionBean zu injezieren:


```
@Stateless
public class HelloBean implements HelloLocal {
    @PersistenceUnit(unitName = "JavaEE-Test-ejbPU")
    private EntityManagerFactory emf;
...
```

Aber auch dies machte keinen Unterschied. Verwendet werden diese von einer JSP aus.

Der jetzt funktionierende Weg ist halt ein Konstruktor für den JPAController:


```
public VisitorJpaController() {
        try {
            InitialContext ctx = new InitialContext();
            this.utx = (UserTransaction) ctx.lookup("java:comp/UserTransaction");
            this.emf = Persistence.createEntityManagerFactory("JavaEE-Test-ejbPU");
        } catch (NamingException ex) {
            Logger.getLogger(VisitorJpaController.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
```

Aber das ist halt ohne Annotation.

Edit: Ich habe mich zu früh gefreut... Die UserTransaction bekomme ich nur wenn ich über ein JSP aufrufe, bei einem Servlet kommt:


```
javax.naming.NameNotFoundException: Lookup of java:comp/UserTransaction not allowed for Container managed Transaction beans
```
 So langsam hasse ich J2EE...


----------

