| 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());
}
}

