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 TestCasemaven 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.