Hibernate 3 + Derby w 5 minut z Maven

Rozpoczęcie pracy z Hibernate naprawdę zajmuje nie więcej niż 5 minut – wystarczy JDK i Maven (moim zdaniem jeden z najbardziej przełomowych i najważniejszych wynalazków świata Javy). Nie wierzycie? Czas start!
Na początek musimy wygenerować nową aplikację. Tutaj z pomocą przychodzi mechanizm archetypów (a ściślej mówiąc Archetype Plugin). Poprzez wywołanie poniższego polecenia stworzymy kompletną strukturę prostego projektu wraz z podstawowym plikiem pom.xm

mvn archetype:generate -DgroupId=com.wordpress.jarekprzygodzki -DartifactId=hibernate-derby-app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

Następnie musimy dodać do pliku projektu wymagane zależności. Na szczęście zarządzanie zależnościami jest tym z czego Maven tak naprawdę słynie najbardziej. Wystarczy dodać do pliku pom.xml elementy dependency opisujące wymagane zależności. Maven podczas budowania automatycznie rozwiąże zależności (także te przechodnie) pobierając wymagane zasoby z repozytorium

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.wordpress.jarekprzygodzki</groupId>
	<artifactId>hibernate-derby-app</artifactId>
	<packaging>jar</packaging>
	<version>1.0-SNAPSHOT</version>
	<name>hibernate-derby-app</name>
	<url>http://maven.apache.org</url>
	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	</properties>
	<dependencies>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.8.1</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-core</artifactId>
			<version>3.6.7.Final</version>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-simple</artifactId>
			<version>1.6.1</version>
		</dependency>
		<dependency>
			<groupId>javassist</groupId>
			<artifactId>javassist</artifactId>
			<version>3.12.0.GA</version>
		</dependency>
		<dependency>
			<groupId>org.apache.derby</groupId>
			<artifactId>derby</artifactId>
			<version>10.8.1.2</version>
		</dependency>
		<dependency>
			<groupId>org.apache.derby</groupId>
			<artifactId>derbytools</artifactId>
			<version>10.8.1.2</version>
		</dependency>
	</dependencies>
</project>

Czas na Hibernate. Plik konfiguracyjny dla bazy danych Derby w trybie osadzonym wygląda następująco

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
	<session-factory>
		<property name="connection.driver_class">org.apache.derby.jdbc.EmbeddedDriver</property>
		<property name="connection.url">jdbc:derby:db/derby.db;create=true</property>
		<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
		<property name="connection.pool_size">5</property>
		<property name="dialect">org.hibernate.dialect.DerbyDialect</property>
		<property name="hibernate.generate_statistics">true</property>
		<property name="show_sql">true</property>
		<property name="current_session_context_class">thread</property>
	</session-factory>
</hibernate-configuration>

i najwygodniej będzie umieścić go w katalogu src\main\resources pod nazwą hibernate.cfg.xml.
Zaraz napiszemy kod testów aby sprawdzić, czy wszystko działa.
Najpierw typowa dla Hibernate-a klasa narzędziowa

package com.wordpress.jarekprzygodzki;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtil {

    private static final SessionFactory sessionFactory = buildSessionFactory();

    private static SessionFactory buildSessionFactory() {
        try {
            return new Configuration().configure().buildSessionFactory();
        } catch (Exception e) {
            throw new RuntimeException("Nie udało się utworzyć fabryki sesji", e);
        }
    }

    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }
}

i już możemy przystąpić do pisania testów. Maven wygenerował już nam klasę AppTest(niestety, dla JUnit 3.x). Wystarczy więc usunąć istniejący kod i zastąpić go naszym

package com.wordpress.jarekprzygodzki;

import org.hibernate.Session;
import org.junit.Test;

public class AppTest {

    @Test
    public void testGetCurrentSesstion() throws Exception {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
    }

    @Test
    public void testTransaction() throws Exception {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        session.getTransaction().commit();
    }
}

i uruchomić testy (Maven automatycznie wykrywa i uruchamia testy JUnit 3.x, JUnit 4 i TestNG pod warunkiem że znajdują się w katalogu src/test i ich nazwy zaczynają się lub kończą od Test lub kończą na TestCase

maven test

Co jednak, gdy będziemy chcieli podłączyć się do naszej bazy danych i podejrzeć jej zawartość? W tym właśnie celu dodany został artefakt derbytools zawierający klienta umożliwiającego nawiązanie połączenia z bazą.

mvn exec:java -Dexec.mainClass="org.apache.derby.tools.ij" -Dij.protocol=jdbc:derby: -Dij.database=db/derby.db

Kompletny kod jest dostępny do pobrania tutaj.

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Log Out / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Log Out / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Log Out / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Log Out / Zmień )

Connecting to %s