Hallo,
ich fange gerade mit Hibernate an. Habe mir nun mal ein paar simple Tutorials angeschaut und versuche die nun auf eigene Faust auszubauen. Kurz zu dem was ich habe: Ich habe eine Person bzw. einen Studenten und ich habe Vorlesungen. Studenten sollen beliebig viele Vorlesungen haben und Vorlesungen sollen natürlich (beliebig) viele Teilnehmer haben. Mal kurz meine Klassen dazu:
Person.javaCode:
@Entity
public class Person implements Serializable {
@Id
@Column(name="Person_ID")
@GeneratedValue
private Long id;
private String name;
private String email;
@Temporal(javax.persistence.TemporalType.DATE)
private Date geburtsdatum;
@ManyToMany
@JoinTable(
name="Students_Courses",
joinColumns={@JoinColumn(name="Person_ID", referencedColumnName="Person_ID")},
inverseJoinColumns={@JoinColumn(name="Course_ID", referencedColumnName="Course_ID")})
private Collection<Course> courses;
public Person(String name, String email, Date geburtsdatum) {
this.name = name;
this.email = email;
this.geburtsdatum = geburtsdatum;
}
public Person () {
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Date getGeburtsdatum() {
return geburtsdatum;
}
public void setGeburtsdatum(Date geburtsdatum) {
this.geburtsdatum = geburtsdatum;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
Course.javaCode:
@Entity
public class Course {
@Id
@Column(name="Course_ID")
@GeneratedValue
private Long Id;
private String title;
@ManyToMany
@JoinTable(
name="Students_Courses",
joinColumns={@JoinColumn(name="Course_ID", referencedColumnName="Course_ID")},
inverseJoinColumns={@JoinColumn(name="Person_ID", referencedColumnName="Person_ID")})
private Collection<Person> students;
public Course(String title) {
this.title = title;
}
public Course () {
}
public Long getId() {
return Id;
}
public void setId(Long Id) {
this.Id = Id;
}
public Collection<Person> getStudents() {
return students;
}
public void setStudents(Collection<Person> students) {
this.students = students;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
Und hier mal meine DAOs:
PersonDAO.javaCode:
public class PersonDAO {
public void createPerson(Person P) {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
Transaction transaction = session.beginTransaction();
session.saveOrUpdate(P);
transaction.commit();
}
public Person getPersonById(Long id) {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
Transaction transaction = session.beginTransaction();
Person person = (Person) session.get(Person.class, id);
transaction.commit();
return person;
}
public void addCourse(Person p, Course c) {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
Transaction transaction = session.beginTransaction();
p.getCourses().add(c);
session.saveOrUpdate(p);
transaction.commit();
}
}
CourseDAO.javaCode:
public class CourseDAO {
public void createCourse(Course c) {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
Transaction transaction = session.beginTransaction();
session.saveOrUpdate(c);
transaction.commit();
}
}
Und abschließend noch mein
Testprogramm:
Code:
public class HibernateTutorialApplication {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
Person p = new Person("Patrick", "bla@bla.de", new Date());
PersonDAO personDAO = new PersonDAO();
personDAO.createPerson(p);
Course c = new Course("Blabla 1");
personDAO.addCourse(p, c);
}
}
Nun bekomme ich allerdings an der Stelle
personDAO.addCourse(p, c); eine NullPointerException welche dann auf die Zeile
p.getCourses().add(c); in PersonDAO.addCourse() zurückzuführen ist. Mir ist schon klar, warum der Fehler nun auftaucht. Augenscheinlich hat Hibernate nicht wie gehofft automatisch eine Collection erstellt.
Nun zu meiner eigentlichen Frage: Ist es meine Aufgabe, die Collections in Person und Course zu initialisieren? Wenn ja, wo und wann tue ich das am Besten? Oder mache ich sonst irgendwas grundlegend falsch?
Ich hoffe Ihr könnt mir weiterhelfen.
Schöne Grüße,
Patrick