Hibernate σε 10 λεπτά


Tο hibernate είναι ένας γρήγορος τρόπος να αποθηκεύονται / ανακτώνται δεδομένα από μια βάση δεδομένων.

Βήμα 1. Κατέβασε όλα τα απαραίτητα

Στο βήμα αυτό κατεβάζεις όλα τα απαραίτητα αρχεία και jarάκια.

Κατέβασε την mySQL από το mysql.com → downloads → MySQL Community Server → Windows ZIP/Setup.EXE (x86) → Pick a mirror → No thanks, just take me to the downloads → Greece [University Of Ioannina] HTTP → mysql-5.0.51b-win32.zip

Κατέβασε τον JDBC driver της από το mysql.com → downloads → Connectors → Connector/J → Source and Binaries (zip) → Pick a mirror → No thanks, just take me to the downloads → Greece [University Of Ioannina] HTTP → mysql-connector-java-5.1.6.zip

Κατέβασε τον hibernate core από το hibernate.org → Download → Hibernate Core → Download → hibernate-3.2.6.ga.zip

Κατέβασε τα hibernate annotations από το hibernate.org → Download → Hibernate Annotations → Download → hibernate-annotations-3.3.1.GA.zip

Βήμα 2. Φτιάξε το σχήμα της βάσης

Στο βήμα αυτό εγκαθιστάς την MySQL, την ρυθμίζεις και φτιάχνεις το σχήμα βάσης με όνομα heat

Η ΜySQL εγκαθίσταται πολύ εύκολα. Στο τέλος της εγκατάστασης ανοίγει ένας οδηγός ρυθμίσεων. Καλό είναι να σημείωσεις σε ένα χαρτί τον κωδικό του διαχειριστή (root).

Πήγαινε Start → Programs → MySQL → MySQL Server 5.0 → MySQL Command Line Client → δώσε τον κωδικό του root.

Γράψε την εντολή CREATE DATABASE heat;

Για επιβεβαίωση γράψε show databases; κι έπειτα use heat;

Είναι χρήσιμο να αφήσεις ανοιχτό το command prompt της MySQL καθώς θα χρειαστεί πιο κάτω.

Όπως φαίνεται έφτιαξες μόνο το σχήμα της βάσης. Τα tables θα τα φτιάξει το hibernate!

Βήμα 3. Μάζεψε όλα τα jarάκια

Στο βήμα αυτό συγκεντρώνεις όλα τα απαραίτητα jarάκια σε έναν κατάλογο, ώστε αργότερα να τα δηλώσεις στο classpath.

Φτιάξε έναν φάκελο π.χ. C:/jars και βάλε μέσα:

  • το hibernate-3.2.6.ga.zip/hibernate3.jar
  • ό,τι υπάρχει μέσα στον κατάλογο hibernate-3.2.6.ga.zip/lib
  • το hibernate-annotations-3.3.1.GA.zip/hibernate-annotations.jar
  • τα hibernate-annotations-3.3.1.GA.zip/lib/hibernate-commons- annotations.jar και ejb3-persistence.jar
  • τον JDBC driver mysql-connector-java-5.1.6.zip/mysql-connector- java-5.1.6-bin.jar

Βήμα 4. Φτιάξε το project.

Φτιάξε ένα project στο Eclipse με το όνομα Hibernate.

Δήλωσε στο classpath τον κατάλογο με τα jarάκια ως εξής:

Project → Properties → Java Build Path → Add External JARs…

Βήμα 5. Γράψε το hibernate.cfg.xml

Στο βήμα αυτό δηλώνεις στο hibernate ποια είναι η βάση δεδομένων και πώς να συνδεθεί με αυτή.

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
 "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
 "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
   <session-factory>
      <!-- Database connection settings -->
      <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
      <property name="connection.url">jdbc:mysql://localhost/heat</property>
      <property name="connection.username">root</property>
      <property name="connection.password">12345</property>

      <!-- SQL dialect -->
      <property name="dialect">org.hibernate.dialect.MySQLDialect</property>

      <property name="transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>
      <property name="current_session_context_class">thread</property>

      <!-- Echo all executed SQL to stdout -->
      <property name="show_sql">true</property>
   </session-factory>
</hibernate-configuration>

Τα properties connection.* είναι ό,τι ακριβώς κάνουμε και στο JDBC. Πρόσεξε να βάλεις το σωστό password!

Ενδιαφέρον παρουσιάζει το SQL dialect: Δηλώνουμε στο hibernate ότι θα μιλάει με βάση MySQL.

Βάλε το αρχείο hibernate.cfg.xml μέσα στoν κατάλογο του project, πχ. C:/Eclipse/workspace/Hibernate. Αρκεί να βρίσκεται στο classpath.

Βήμα 6. Φτιάξε το μοντέλο

Η εφαρμογή διαχειρίζεται άτομα. Για κάθε άτομο μας ενδιαφέρει το όνομά του κι ένας μοναδικός αριθμός.

κλάση: Person

κατάσταση: Long id, String name

συμπεριφορά: setId(), getId(), setName(), getName()

public class Person {

	private Long id;
	private String name;

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

}

Πρόκειται για ένα απλό java bean. Αυτό που κάναμε μέχρι τώρα ήταν η δημιουργία α. ενός table person στη βάση δεδομένων και β. μιας κλάσης με καθαρό JDBC: insert(Person person), select(Long id), update(Person person), delete(Long id) κλπ. Πλέον αυτά τα αναλαμβάνει το Hibernate, εμείς απλά χρησιμοποιούμε annotations του Java Persistence API.

import javax.persistence.*;

@Entity
public class Person {

	private Long id;
	private String name;

	@Id
	@GeneratedValue
	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;
	}

}

Το Entity δηλώνει ότι τα αντικείμενα που δημιουργούνται από την κλάση Person είναι προς αποθήκευση στη ΒΔ. Μάλιστα υπάρχει η δυνατότητα το Hibernate να δημιουργήσει μόνο του το αντίστοιχο table στη βάση.

To id δηλώνει το κύριο κλειδί.

Το GeneratedValue δηλώνει ότι η βάση δεδομένων αναλαμβάνει τη μοναδικότητα του id. (Στη MySQL είναι η ένδειξη AUTO_INCREMENT)

Βήμα 7. Ώρα για δράση

Δημιούργησε το table person στη βάση ως εξής:

	// συνηθισμένη αρχικοποίηση
	AnnotationConfiguration config = new AnnotationConfiguration();
	config.addAnnotatedClass(Person.class);
	config.configure();

	// δημιούργησε το table στη βάση δεδομένων
	new SchemaExport(config).create(true, true);

Κατά τη συνηθισμένη αρχικοποίηση προστίθεται η κλάση Person config.addAnnotatedClass(Person.class);. Αμέσως μετά διαβάζονται οι ρυθμίσεις από το hibernate.cfg.xml καθώς και οι κλάσεις που έχουν @Entity config.configure();. Αυτές οι προτάσεις ανήκουν λογικά σε κάποιον constructor.

Η πρόταση new SchemaExport(config).create(true, true); δημιουργεί τα tables στη βάση δεδομένων από το μηδέν. Σε περίπτωση που τα tables είχαν ήδη οριστεί, τα ξαναδημιουργεί σβήνοντας όλα τα δεδομένα τους.

Για επιβεβαίωση γράψε στο command prompt της MySQL show tables;.

Αποθήκευσε ένα αντικείμενο στη βάση

	// συνηθισμένη αρχικοποίηση
	AnnotationConfiguration config = new AnnotationConfiguration();
	config.addAnnotatedClass(Person.class);
	config.configure();

	// θέλουμε να αποθηκεύσουμε στη βάση τον Vincent Hanna
	Person person = new Person();
	person.setName("Vincent Hanna");

	// χρονοβόρα αρχικοποίηση - 1 φορά για κάθε εφαρμογή
	SessionFactory factory = config.buildSessionFactory();
	// πάρε το session
	Session session = factory.getCurrentSession();
	// αποθήκευσε
	session.beginTransaction();
	session.save(person);
	session.getTransaction().commit();

H πρόταση SessionFactory factory = config.buildSessionFactory(); κοστίζει πολύ. Ως εκ τούτου το αντικείμενο factory καλό είναι να δημιουργείται 1 φορά ανά εφαρμογή. (πχ. στρατηγική singleton).

Για επιβεβαίωση γράψε στο command prompt της MySQL SELECT * FROM person;.

Χρησιμοποιώντας μια κλάση με utility static μεθόδους το παραπάνω γράφεται

	// θέλουμε να αποθηκεύσουμε στη βάση τον Vincent Hanna
	Person person = new Person();
	person.setName("Vincent Hanna");
	DataBase.save(person);

Συμπέρασμα: Κερδίζουμε σε χρόνο επειδή πλέον δεν χρειάζεται 1. να δημιουργήσουμε με το χέρι τα tables στη βάση δεδομένων και 2. να γράψουμε μακροσκελείς JDBC κλάσεις με τις συνηθισμένες λειτουργίες (εισαγωγή, αλλαγή, επιλογή, διαγραφή).

3 Responses to Hibernate σε 10 λεπτά

  1. Xristomanos says:

    Χρησιμοποιώντας μονο το hibernate μπορούμε να παρακάμψουμε την jdbc?
    Υπάρχει μήπως κάποιο ολοκληρωμένο εγχειρίδιο για το hibernate στα ελληνικά.
    Ευχαριστώ.

  2. Ναι μπορείς. Η πλέον εύχρηστη τεχνολογία για το σκοπό αυτό λέγεται JPA (Java Persistence API). Πρόκειται για το αποτέλεσμα συλλογικής δουλειάς μεγάλων εταιρειών και κοινοτήτων ελεύθερου λογισμικού. Το Hibernate είναι μια βιβλιοθήκη που υλοποιεί πλήρως το JPA. Ένα εξαιρετικό βιβλίο είναι το M. Keith, M. Schnicariol, “Pro JPA 2 – Mastering the Java™ Persistence API“, Apress, USA, 2009. Ενδεχομένως να το έχει μεταφράσει κάποιος εκδοτικός οίκος στα Ελληνικά.

  3. Xristomanos says:

    Ευχαριστώ πάρα πολύ για την συμβουλή
    Το βιβλίο το βρήκα και είναι πολύ κατατοπιστικό,
    (δυστυχώς υπάρχει προς το παρόν μόνο στα αγγλικά).
    Ευχαριστώ πάρα πολύ.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: