home  |  suche  |  kontakt/johner  |  institut 
studierende  |  tech-docs  |  mindmailer 

Beispiel

Dieses einfache Beispiel zeigt Euch, wie man ein typisches Klassendiagramm in Java umsetzt und die Instanzen dieser Klassen mit Hibernate persistiert. Dabei wird klar wie man

  • Klassen,
  • Attribute
  • Vererbungsbeziehungen,
  • 1-Beziehungen und
  • n-Beziehungen (am Beispiel einer 1:n-Beziehung)

umsetzt. Hier das Klassendiagramm.

Book

package entities;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

@Entity
@Table(name="Books")
public class Book {
  @Id
  private int isbn;
  private String title;
  @ManyToOne
  @JoinColumn(name = "author_fk")
  private Author author;
  
  public Book(){}
  
  public Book(int isbn, String title, Author author) {
    this.isbn = isbn;
    this.title = title;
    this.author = author;
  }

  public int getIsbn() {
    return isbn;
  }

  public void setIsbn(int isbn) {
    this.isbn = isbn;
  }

  public String getTitle() {
    return title;
  }

  public void setTitle(String title) {
    this.title = title;
  }

  public Author getAuthor() {
    return author;
  }

  public void setAuthor(Author author) {
    this.author = author;
  }
  
}

Author

package entities;

import java.util.Collection;
import java.util.HashSet;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import javax.persistence.OneToMany;
import javax.persistence.OrderBy;

@Entity
@DiscriminatorValue("Angestellter")
public class Author extends Person {
  @Column(name="SecretName")
  private String pseudonym;

  @OneToMany(mappedBy = "author", cascade = CascadeType.ALL//Cascade optional
  @OrderBy("isbn asc")
  private Collection<Book> books;

  public Author(String pseudonym, String name) {
    super(name);
    this.pseudonym = pseudonym;
    books = new HashSet<Book>();
  }
  
  public void addBook(Book b) {
    books.add(b);
  }

  public Collection<Book> getBooks() {
    return books;
  }

  public void setBooks(Collection<Book> books) {
    this.books = books;
  }

  public String getPseudonym() {
    return pseudonym;
  }

  public void setPseudonym(String pseudonym) {
    this.pseudonym = pseudonym;
  }
  
  
}

Person

package entities;

import javax.persistence.DiscriminatorColumn;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;

@Entity(name="Persons")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="persontype")
@DiscriminatorValue("AllgPerson")
public class Person {
  @Id
  @GeneratedValue(strategy=GenerationType.AUTO)
  private int personId;
  private String name;
  
  public Person(){}
  
  public Person(String name) {
    this.name = name;
  }

  public int getPersonId() {
    return personId;
  }

  public void setPersonId(int personId) {
    this.personId = personId;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

}

Startklasse

Man kann den Code wie hier natürlich mit jeder normalen "Main-Klasse" testen, ich empfehle jedoch eher einen JUnit-Test.

package client;

import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

import util.SessionFactoryUtil;
import entities.Author;
import entities.Book;

public class Start {
  public static void main(String[] args) {
    Session session = SessionFactoryUtil.getSessionFactory()
        .getCurrentSession();
    Transaction tx = session.beginTransaction();

    // Auto generated id
    Author goethe = new Author("Jonny""von Goethe");
    session.save(goethe);
    System.out.println(goethe.getPseudonym() "got id " + goethe.getPersonId());

    // Queries
    Book book1 = new Book();
    book1.setIsbn(123);
    book1.setTitle("Faust");
    session.save(book1);

    Book book2 = new Book();
    book2.setIsbn(345);
    book2.setTitle("Goetz vor Berlichingen");
    session.save(book2);

    Book book3 = new Book();
    book3.setIsbn(678);
    book3.setTitle("Faust Teil 2");
    session.save(book3);

    // Find book by primary key
    Book foundBook = (Booksession.load(Book.class, new Integer(345));
    System.out.println("Buch mit isbn 123: " + foundBook.getTitle());

    // Find book via query attributes
    Query query = session
        .createQuery("select k from Book k where k.title like 'Faus%'");
    List<Book> books = query.list();
    for (Book book : books) {
      System.out.println("We found a book " + book.getTitle()
          " with isbn " + book.getIsbn());
    }

    // 1:n associations
    book1.setAuthor(goethe);
    goethe.addBook(book1);
    book2.setAuthor(goethe);
    goethe.addBook(book2);
    session.save(goethe);

    Author anAuthor = (Authorsession.load(Author.class, new Integer(1));
    for (Book book : anAuthor.getBooks()) {
      System.out.println("The author '" + book.getAuthor().getName()
          "' wrote the book " + book.getTitle() " with isbn "
          + book.getIsbn());
    }

    tx.commit();
    System.out.println("Fertig!");
    System.exit(0);
  }
}