JPA EntityManager auslagern

Status
Nicht offen für weitere Antworten.

QDog

Mitglied
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:
Code:
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:
Code:
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:
Code:
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?
 
G

Guest

Gast
Die NullPointerException kommt wegen dem hier
Code:
EntityManagerFactory factory = Persistence.createEntityManagerFactory("Stundenplanungsprogramm"); 
EntityManager em = factory.createEntityManager();
Ersetze es durch
Code:
factory = Persistence.createEntityManagerFactory("Stundenplanungsprogramm"); 
em = factory.createEntityManager();
Ansonsten mach die Transaktion raus aus dem Konstruktor. Da hat es nichts zu suchen.
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben