wtorek, 26 stycznia 2010

Sprawdź to szybko z @Grapes

W książce o Hibernate (którą sobie czytam) piszą, że uruchomienie Hibernate jest ciężkie i paskudne, bo trzeba dużo bibliotek zebrać, wrzucić na classpath i to wszystko skonfigurować. No, kilka ich jest. Jeszcze trzeba znaleźć w Internecie paczkę, ściągnąć, wybrać wymagane pliki itp. Wybrać jakąś bazę danych

To jest mało wygodne. To może maven? Hm, sprawdzam, integracja z Eclipse dalej leży choć wyraźnie się poprawiła w ostatnim roku, na Idea brak miejsca, Netbeans nie lubie. Hm, jeszcze jest Ivy...

Po analizie różnych rozwiązań, za najprostsze uznałem Grape. Grape to:
  • Deklaratywne zarządzanie zależnościami za pomocą adnotacji (@Grab).
  • To co potrzeba zostanie ściągnięte do lokalnego repozytorium i dorzucone do classpath w trakcie uruchamiania skryptu / klasy.
  • Obsługa linii poleceń – (grape install <groupid> <artifactid> [<version>])
  • Nic nie trzeba instalować jeśli ma się Groovy


Wystarczy deklaratywnie napisać czego nam potrzeba . Grape korzysta z Ivy, więc mamy dostęp do całego dobrodziejstwa znanego z repozytoriów Maven. Przykład z Hibernate:


package hello;

import javax.persistence.*;
import org.hibernate.*;
import org.hibernate.cfg.*;

//Wymagane zaleznosci:
@Grapes([
@Grab(group='org.hibernate', module='hibernate-annotations', version='3.4.0.GA'),
@Grab(group='hsqldb', module='hsqldb', version='1.8.0.7'),
//niestety slf4j i javaassist trzeba dodać ręcznie bo w POM są pewnie jako opcjonalne (lub wcale), ale domyślnie wybierane przez Hibernate
@Grab(group='org.slf4j', module='slf4j-simple', version='1.4.2'),
@Grab(group='javassist', module='javassist', version='3.4.GA')
])
@Entity
class Book{
@Id @GeneratedValue(strategy = GenerationType.AUTO)
Long id
String title
String author
String toString(){ "$title by $author" }
}

def prepareSessionFactory(){
def config = new AnnotationConfiguration()
[
"hibernate.dialect": "org.hibernate.dialect.HSQLDialect",
"hibernate.connection.driver_class": "org.hsqldb.jdbcDriver",
"hibernate.connection.url": "jdbc:hsqldb:mem:demodb",
"hibernate.connection.username": "sa",
"hibernate.connection.password": "",
"hibernate.hbm2ddl.auto": "create-drop",
"hibernate.show_sql": "true",
"hibernate.current_session_context_class": "thread"
].each{ key, value -> config.setProperty (key, value)}

config.addAnnotatedClass(Book)
config.buildSessionFactory()
}

def session = prepareSessionFactory().openSession();
Transaction tx = null;
try{

tx = session.beginTransaction()
def b = new Book(title:"Narrenturm",author:"Sapkowski")
session.persist b
tx.commit()

tx = session.beginTransaction()
Book b2 = session.createQuery("From Book").list().first()
println b2
tx = null

}catch(HibernateException e){
if(tx != null) tx.rollback()
println e
}finally{
session.close()
}


Uruchamiam z poziomu Eclipse, można też wrzucić do GroovyConsole i uruchomić, wszystkie wymagane biblioteki powinny się ściągnąć same, przykład ze strony Groovy mi dział, a ten nie... To znaczy ściąganie działa, ale Hibernate nie. Z poziomu Eclipse mi to działa, z GroovyConsole wyskakuje za to błąd dostępu do pól, ciekawe... Pewnie kwestia generowania kodu. Na razie działające Eclipse z podpowiadaniem kodu mi wystarcza, no i mały skrypt co kopiuje wszystkie biblioteki ściągnięte przez Grapes do Eclipse ;)

2 komentarze:

Jacek Laskowski pisze...

To jest na prawdę dobre. Obym miał takich wzorców do naśladowania więcej :) Niedługo SFI i 4Developers, a na nich tylko 45 minut, więc gdyby tak skorzystać z tego pomysłu...(oczywiście nie zdradzę skąd to wiem :P)

Krzysiek pisze...

No, nie ma to jak wzór co pisze 1 post rocznie ;)