Nie mam żadnego doświadczenia z Hibernate, dopiero się uczę. Chciałbym zaczerpnąć jakiejś inspiracji odnośnie klas serwisowych, które przy użyciu Hibernate wykonują proste operacje na bazie danych. W każdej aplikacji taki kod się powiela, dlatego prosiłbym o wskazówki, jak powinienem je pisać.
Zamieszczam mój kod, coby łatwiej było wskazać moje błędy:
klasa serwisowa
package model.service;
import org.hibernate.Session;
import org.hibernate.Transaction;
import config.Factory;
import model.entity.Group;
public class GroupService {
Session session = new Factory().getSessionFactory().openSession();
public Group get(String name) {
try
{
try
{
return (Group)session.createQuery("select g from Group g where g.name = '"+name+"'").uniqueResult();
}
catch (Exception e)
{
System.out.println(e.getMessage());
return null;
}
}
finally {
session.close();
}
}
public boolean add(String name) {
try
{
try
{
Transaction t = session.beginTransaction();
session.save(new Group(name));
t.commit();
return true;
}
catch (Exception e)
{
System.out.println(e.getMessage());
return false;
}
}
finally {
session.close();
}
}
public boolean delete(String name) {
try
{
try
{
Transaction t = session.beginTransaction();
session.createQuery("delete Group g where g.name = '"+name+"'").executeUpdate();
t.commit();
return true;
}
catch (Exception e)
{
System.out.println(e.getMessage());
return false;
}
}
finally {
session.close();
}
}
public boolean update(String name, String newName) {
try
{
try
{
Transaction t = session.beginTransaction();
session.createQuery("update Group g set g.name = '"+newName+"' where g.name = '"+name+"'").executeUpdate();
t.commit();
return true;
}
catch (Exception e)
{
System.out.println(e.getMessage());
return false;
}
}
finally {
session.close();
}
}
}
fabryka zwracająca sesję
package config;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
public class Factory {
private static ServiceRegistry serviceRegistry;
private static final SessionFactory sessionFactory;
static {
try {
Configuration configuration = new Configuration();
configuration.configure();
serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
sessionFactory = configuration.buildSessionFactory(serviceRegistry);
} catch (Throwable ex) {
System.err.println("Failed to create sessionFactory object." + ex);
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
Przede wszystkim nie podoba mi się to, że każda metoda serwisowa powiela ten sam kod: dwa bloki try, tworzenie transakcji. Mimo, że są to bardzo proste operacje, to praktycznie każda metoda ma 20 linii. Czy konieczne jest zamykanie sesji przez session.close() ? Czy jest w ogóle sens stosować transakcje, jeżeli wykonujemy jedną prostą operacje na bazie danych ? Czy powinienem łapać mniej ogólne wyjątki ? Będę wdzięczny za jakiekolwiek wskazówki.