# JPA EntityManager auslagern



## QDog (11. Apr 2008)

Hallo,

ich möchte gerade mit Hilfe von JPA eine Datenbankanwendung bauen. Ich bin noch nicht sonderlich konform mit Java, aber nach meinem Wissen sollte hier alles richtig sei. Ich habe hier eine  Klasse Lehrer, die eine Tabelle in der DB darstellt, eine Klasse DB, die alles mit dem Entitymanager übernimmt und eine Main. Anfangs hatte ich versucht die Lehrer Klasse die DB Klasse erweitern zu lassen, doch das ging auch schief. Hier erstmal die Klassen:

Lehrer:

```
package model;

import javax.persistence.*;

@Entity
@Table(schema="ae")
public class Lehrer {
	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	int lid;
	String name;
	String vorname;
	String kurzform;
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getVorname() {
		return vorname;
	}
	public void setVorname(String vorname) {
		this.vorname = vorname;
	}
	public String getKurzform() {
		return kurzform;
	}
	public void setKurzform(String kurzform) {
		this.kurzform = kurzform;
	}
	public int getLid() {
		return lid;
	}
	
//	public Query fetchAll() {
//		return em.createQuery("select l from Lehrer l");
//	}
//	
//	public Query fetchRow(int id) {
//		return em.createQuery("select l from Lehrer l where lid = " + id);
//	}
	
	
}
```

DB:

```
package model;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

public class DB {

	EntityManager em;
	EntityManagerFactory factory;

	public DB() {
		// Create the Entity Manager
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("Stundenplanungsprogramm");
		EntityManager em = factory.createEntityManager();

		// Begin a new local transaction so that we can persist a new entity
		em.getTransaction().begin();
	}
	
	protected void finalize() throws Throwable
	{
		// Commit the transaction, which will cause the entity to
		// be stored in the database
		em.getTransaction().commit();

		// It is always good practice to close the EntityManager so that
		// resources are conserved.
		em.close();
		factory.close();
	}
	
	public void save(Object obj) {
		em.persist(obj);
	}
}
```

Main:

```
import javax.persistence.*;

import model.*;


public class Main {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		DB db = new DB();
		
		Lehrer lehrer = new Lehrer();
		lehrer.setName("test4");
		lehrer.setVorname("vortest4");
		lehrer.setKurzform("kurztest4");
		
		db.save(lehrer);
		
	}

}
```

Bekomme jedesmal folgendes:


> Exception in thread "main" java.lang.NullPointerException
> at model.DB.save(DB.java:34)
> at Main.main(Main.java:20)



Warum? Kann ich den EntityManager nicht auslagern? Wäre es nicht nett, wenn die Lehrer Klasse direkt eine save()-Methode hätte, ohne, das ich das lehrer Objekt an die persist()-Methode übergeben muss?


----------



## QDog (12. Apr 2008)

Kann mir da etwa niemand helfen?


----------



## Guest (12. Apr 2008)

Die NullPointerException kommt wegen dem hier
	
	
	
	





```
EntityManagerFactory factory = Persistence.createEntityManagerFactory("Stundenplanungsprogramm"); 
EntityManager em = factory.createEntityManager();
```
Ersetze es durch 
	
	
	
	





```
factory = Persistence.createEntityManagerFactory("Stundenplanungsprogramm"); 
em = factory.createEntityManager();
```
Ansonsten mach die Transaktion raus aus dem Konstruktor. Da hat es nichts zu suchen.


----------

