home  |  suche  |  kontakt/johner  |  institut  |  hinweise 
studierende  |  tech-docs  |  blog  |  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.

Order

package hibernate;

import java.util.Date;

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


@Entity
@Table(name="Bestellung")
public class Order {
  private int bestellid;
  private Date datum;
  private String bestellnummer;
  private Customer customer;
  
  public Order() {
  }

  public Order(Date datum, Customer kunde) {
    this.datum = datum;
    this.customer = kunde;
  }

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  public int getBestellid() {
    return bestellid;
  }

  public void setBestellid(int bestellid) {
    this.bestellid = bestellid;
  }

  public Date getDatum() {
    return datum;
  }
  public void setDatum(Date datum) {
    this.datum = datum;
  }

  public String getBestellnummer() {
    return bestellnummer;
  }
  
  public void setBestellnummer(String bestellnummer) {
    this.bestellnummer = bestellnummer;
  }

  @ManyToOne
  @JoinColumn(name = "kunden_fk")
  public Customer getCustomer() {
    return customer;
  }
  public void setCustomer(Customer kunde) {
    this.customer = kunde;
  }
}

Customer

package hibernate;

import java.util.ArrayList;
import java.util.List;

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
//@Table(name="Kunde") //kann (bei Vererbung muss) weggelassen werden
@DiscriminatorValue("Kunde")
public class Customer extends BusinessPartner{
  private int customerId;
  private String firstname;
  private List<Order> orders = new ArrayList<Order>();

  public Customer() {
  }

  public Customer(String vorname) {
    this.firstname = vorname;
  }

  public int getCustomerId() {
    return customerId;
  }

  public void setCustomerId(int id) {
    this.customerId = id;
  }

  @Column (name="vorname"//kann weggelassen werden
  public String getFirstname() {
    return firstname;
  }

  public void setFirstname(String vorname) {
    this.firstname = vorname;
  }
  
  //mapped zur Methode getCustomer bzw. Attribut Customer auf Order
  @OneToMany(mappedBy = "customer", cascade = CascadeType.ALL//Cascade optional
  @OrderBy("bestellnummer asc")
  public List<Order> getOrders() {
    return orders;
  }

  public void setOrders(List<Order> bestellungen) {
    this.orders = bestellungen;
  }
  
  public void addBestellung(Order bestellung){
    orders.add(bestellung);
  }
}

BusinessPartner

package hibernate;

import javax.persistence.DiscriminatorColumn;
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
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="klassenname")
public abstract class BusinessPartner {
  private String passwort;
  private int id;

  public BusinessPartner() {
  }

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  public int getId() {
    return id;
  }

  public void setId(int id) {
    this.id = id;
  }

  public String getPasswort() {
    return passwort;
  }

  public void setPasswort(String passwort) {
    this.passwort = passwort;
  }
}

Testklasse

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

package hibernate;


import static org.junit.Assert.assertEquals;

import hibernate.BusinessPartner;
import hibernate.Customer;
import hibernate.Employee;
import hibernate.HibernateSessionFactory;
import hibernate.Order;

import java.util.Date;
import java.util.List;
import java.util.Map;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.persister.entity.SingleTableEntityPersister;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;


public class TestHibernate {
  private static Session session;
  private static Transaction tx;

  @BeforeClass
  public static void setUpBeforeClass() throws Exception {
    session = HibernateSessionFactory.currentSession();
  }

  @AfterClass
  public static void tearDownAfterClass() throws Exception {
    session.close();
  }

  @Before
  public void setUp() throws Exception {
    tx = session.beginTransaction();  }

  @After
  public void tearDown() throws Exception {
    tx.commit();
  }
  
  @Test
  public void objekteAnlegen() {
    Customer karl = new Customer();
    karl.setFirstname("Karl");
    session.save(karl);
    assertEquals(1, karl.getId());
    System.out.println("Karl hat die Id: " + karl.getId() );
  }
  
  
  @Test
  public void mitPrimaerschluesselSuchen(){
    Customer karl = (Customer)session.load(Customer.class, new Integer(1));
    assertEquals("Karl", karl.getFirstname());
    System.out.println("Karl heißt " + karl.getFirstname());

  }
  
  @Test
  public void mitAttributenSuchen(){
    Customer anita = new Customer("Anita");
    session.save(anita);
    Query query = session.createQuery("select k from Customer k where k.firstname like 'Kar%'");
    List<Customer> kunden = query.list();
    for(Customer kunde: kunden){
      System.out.println("Wir haben einen Kunden gefunden: " + kunde.getFirstname());
    }
    assertEquals(1, kunden.size());
  }

  @Test
  public void one2many(){
    Customer karl = (Customer)session.load(Customer.class, new Integer(1));
    
    //Artikel 1
    Order cd = new Order(new Date(), karl);
    cd.setBestellnummer("CD-1");
    cd.setCustomer(karl);
    karl.addBestellung(cd);
    session.save(cd);
    
    
    //Artikel 2
    Order track = new Order(new Date(), karl);
    track.setBestellnummer("Track-1");
    track.setCustomer(karl);
    karl.addBestellung(track);
    session.save(track);
    
    Query query = session.createQuery("select b from Order b where b.customer.firstname like 'Kar%'");
    List<Order> bestellungen = query.list();
    assertEquals("Anzahl Bestellungen"2, bestellungen.size());
    System.out.println("Anzahl Bestellungen: " + bestellungen.size());
    for(Order bestellung: bestellungen){
      System.out.println("Wir haben eine Bestellung " + bestellung.getBestellnummer());
    }
  }
  
  @Test
  public void vererbung(){
    Employee angestellter = new Employee();
    angestellter.setNachname("Arbeiter");
    session.save(angestellter);

    Query query = session.createQuery("select a from Employee a where a.nachname like 'Arb%'");
    List<Employee> angestellte = query.list();
    BusinessPartner person = angestellte.iterator().next()
    assertEquals(3, person.getId());
    System.out.println("Unser Angestellter heißt: " ((Employee)person).getNachname());
  }
}