J
JavaNeuling1955
Gast
Hallo Zusammen,
ich bin noch ein ziemlicher Neuling und komme einfach nicht weiter.
Was habe ich vor?
Ich möchte mir ein kleines Programm schreiben um meine Filme zu Verwalten. Dabei soll nicht merkbar eine Datenbank im Hintergrund laufen.
Wie möchte ich es umsetzen?
Durch ein Tutorial, dass auch ohne Probleme bei mir lief, bin ich an EclipseLink und Apache Derby gekommen.
Im Programm selbst lebt ein ModelManager, der die Filme nach dem laden aus der Datenbank verwalten soll. Dazu soll er nicht nur eine Liste aller Filme, sondern auch eine Liste mit allen Personen enthalten.
Die Klassen Regisseur und Schauspieler erbt von der Klasse Person.
Film {String Titel, String Beschreibung, ..,Regisseur regisseur, List<Schauspieler> schauspieler,..}
Person {String vorname, String nachname,.., List<Film> filme,..}
Da auf Anhieb nichts geklappt hat, habe ich Person und Schauspieler raus geworfen und möchte nur die Regisseure speichern.
Jetzt aber zu meinem Fehler:
Ich vermute, dass ich die Annotation bei den Entitys falsch gemacht habe.
Film:
Regisseur:
persistence.xml
[XML]<?xml version="1.0" encoding="UTF-8" ?>
<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_2_0.xsd"
version="2.0" xmlns="http://java.sun.com/xml/ns/persistence">
<persistence-unit name="datenbank" transaction-type="RESOURCE_LOCAL">
<class>de.cl.testprojekt.model.Film</class>
<class>de.cl.testprojekt.model.Regisseur</class>
<properties>
<property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.EmbeddedDriver" />
<property name="javax.persistence.jdbc.url"
value="jdbc:derby:datenbank;create=true" />
<property name="javax.persistence.jdbc.user" value="test" />
<property name="javax.persistence.jdbc.password" value="test" />
<!-- EclipseLink should create the database schema automatically -->
<property name="eclipselink.ddl-generation" value="create-tables" />
<property name="eclipselink.ddl-generation.output-mode"
value="database" />
</properties>
</persistence-unit>
</persistence>[/XML]
ich bin noch ein ziemlicher Neuling und komme einfach nicht weiter.
Was habe ich vor?
Ich möchte mir ein kleines Programm schreiben um meine Filme zu Verwalten. Dabei soll nicht merkbar eine Datenbank im Hintergrund laufen.
Wie möchte ich es umsetzen?
Durch ein Tutorial, dass auch ohne Probleme bei mir lief, bin ich an EclipseLink und Apache Derby gekommen.
Im Programm selbst lebt ein ModelManager, der die Filme nach dem laden aus der Datenbank verwalten soll. Dazu soll er nicht nur eine Liste aller Filme, sondern auch eine Liste mit allen Personen enthalten.
Die Klassen Regisseur und Schauspieler erbt von der Klasse Person.
Film {String Titel, String Beschreibung, ..,Regisseur regisseur, List<Schauspieler> schauspieler,..}
Person {String vorname, String nachname,.., List<Film> filme,..}
Da auf Anhieb nichts geklappt hat, habe ich Person und Schauspieler raus geworfen und möchte nur die Regisseure speichern.
Jetzt aber zu meinem Fehler:
Java:
EntityManager theManager = getPersistence();
EntityTransaction et = theManager.getTransaction();
et.begin();
Java:
java.lang.NullPointerException
at org.eclipse.persistence.internal.jpa.EntityManagerImpl.getActivePersistenceContext(EntityManagerImpl.java:1673)
at org.eclipse.persistence.internal.jpa.transaction.EntityTransactionImpl.begin(EntityTransactionImpl.java:49)
at de.cl.testprojekt.controller.db.DatenbankDAO.speicherFilm(DatenbankDAO.java:50)
at de.cl.testprojekt.controller.db.DatenbankDAO_test.kannDatenbankLaden(DatenbankDAO_test.java:25)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Ich vermute, dass ich die Annotation bei den Entitys falsch gemacht habe.
Film:
Java:
@Entity
public class Film {
@Id
@GeneratedValue(strategy = GenerationType.TABLE)
private long id;
private String titel;
private String genre;
private String länge;
private int Bewertung;
@ManyToOne
private Regisseur regisseur;
private String nonsenseField = "";
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
.
.
.
.
public Regisseur getRegisseur() {
return regisseur;
}
public void setRegisseur(Regisseur regisseur) {
this.regisseur = regisseur;
regisseur.getFilme().add(this);
}
@Transient
public String getNonsenseField() {
return nonsenseField;
}
public void setNonsenseField(String nonsenseField) {
this.nonsenseField = nonsenseField;
}
}
Regisseur:
Java:
@Entity
public class Regisseur {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
private String vorname;
private String nachname;
@OneToMany(mappedBy = "regisseur")
private List<Film> filme;
private String nonsenseField = "";
public Regisseur() {
filme = new ArrayList<Film>();
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
.
.
.
.
@Transient
public String getNonsenseField() {
return nonsenseField;
}
public void setNonsenseField(String nonsenseField) {
this.nonsenseField = nonsenseField;
}
}
persistence.xml
[XML]<?xml version="1.0" encoding="UTF-8" ?>
<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_2_0.xsd"
version="2.0" xmlns="http://java.sun.com/xml/ns/persistence">
<persistence-unit name="datenbank" transaction-type="RESOURCE_LOCAL">
<class>de.cl.testprojekt.model.Film</class>
<class>de.cl.testprojekt.model.Regisseur</class>
<properties>
<property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.EmbeddedDriver" />
<property name="javax.persistence.jdbc.url"
value="jdbc:derby:datenbank;create=true" />
<property name="javax.persistence.jdbc.user" value="test" />
<property name="javax.persistence.jdbc.password" value="test" />
<!-- EclipseLink should create the database schema automatically -->
<property name="eclipselink.ddl-generation" value="create-tables" />
<property name="eclipselink.ddl-generation.output-mode"
value="database" />
</properties>
</persistence-unit>
</persistence>[/XML]