Klasy serwisowe wykorzystujące Hibernate

0

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.

0

Po to używa się programowania aspektowego na przykład ;) W metodzie "biznesowej" masz tylko faktyczny istotny kod, a to wszystko "dookoła" dodajesz poprzez odpowiedni aspekt.

1 użytkowników online, w tym zalogowanych: 0, gości: 1