Injected EntityManager und EntityManagerFactory ist null

Status
Nicht offen für weitere Antworten.

homer3

Mitglied
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
Java:
    @PersistenceUnit(unitName = "JavaEE-Test-ejbPU")
    private EntityManagerFactory emf;
als auch
Java:
    @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:
Code:
<?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

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

?
 

homer3

Mitglied
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

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

homer3

Mitglied
Ziel war es den von Netbeans generierten JPAController zu nutzen:

Java:
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:

Java:
@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:

Java:
    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:

Code:
javax.naming.NameNotFoundException: Lookup of java:comp/UserTransaction not allowed for Container managed Transaction beans
So langsam hasse ich J2EE... :D
 
Zuletzt bearbeitet:
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben