Hibernate + DAO Objects

e.motion

Mitglied
Hallo,

HibernateConnection Klasse:

Code:
public class ConnectionFactory
{

	private static ConnectionFactory instance = null;
	private SessionFactory sessionFactory = null;

	private ConnectionFactory()
	{
		try
		{
			sessionFactory = new Configuration().configure().buildSessionFactory();

		}
		catch (MappingException e)
		{
			System.err.println("Mapping Exception" + e.getMessage());
			throw new RuntimeException(e);
		}
		catch (HibernateException e)
		{
			System.err.println("Hibernate Exception" + e.getMessage());
			throw new RuntimeException(e);
		}

	}

	public static synchronized ConnectionFactory getInstance()
	{
		if (instance == null)
		{
			instance = new ConnectionFactory();
		}
		return instance;
	}

	public Session getSession()
	{
		try
		{
			Session s = sessionFactory.openSession();
			return s;
		}
		catch (HibernateException e)
		{
			System.err.println("Hibernate Exception" + e.getMessage());
			throw new RuntimeException(e);
		}
	}

}

2 Beispiel POJOs:

Code:
public class Packet
{
	private PacketCategory packetCategory;

	public Packet()
	{
	}
	
	public PacketCategory getPacketCategory()
	{
		return packetCategory;
	}
	
	public void setPacketCategory(PacketCategory packetCategory)
	{
		this.packetCategory = packetCategory;
	}
}

Code:
public class PacketCategory
{
	private SortedSet packets = new TreeSet();

	public SortedSet getPackets()
	{
		return packets;
	}
	
	public void setPackets(SortedSet packets)
	{
		this.packets = packets;
	}
}

PacketCategoryService (DAO)Klasse:

Code:
public class PacketCategoryService
{
	public static PacketCategoryService instance;
	
	public PacketCategoryService()
	{
	}
	
	public static synchronized PacketCategoryService getInstance()
	{
		if (instance == null)
		{
			instance = new PacketCategoryService();
		}
		return instance;
	}

	
	public PacketCategory getPacketCategory(int primaryKey)
	{
		Session session = ConnectionFactory.getInstance().getSession();
		
		try
		{
			return (PacketCategory)session.load(PacketCategory.class, new Integer(primaryKey));
		}
		catch (ObjectNotFoundException onfe)
		{
			return null;
		}
		catch (HibernateException e)
		{
			System.err.println("Hibernate Exception" + e.getMessage());
			throw new RuntimeException(e);
		}
		finally
		{
			if (session != null)
			{
				try
				{
					session.close();
				}
				catch (HibernateException e)
				{
					System.err.println("Hibernate Exception" + e.getMessage());
					throw new RuntimeException(e);
				}

			}
		}
		
	}
	
	public List getPacketCategoryList()
	{
		Session session = ConnectionFactory.getInstance().getSession();

		try
		{
			Query query = session.createQuery("select packetCategory from model.PacketCategory as packetCategory");
			return query.list();
		}
		catch (HibernateException e)
		{
			System.err.println("Hibernate Exception" + e.getMessage());
			throw new RuntimeException(e);
		}
		finally
		{
			if (session != null)
			{
				try
				{
					session.close();
				}
				catch (HibernateException e)
				{
					System.err.println("Hibernate Exception" + e.getMessage());
					throw new RuntimeException(e);
				}
			}
		}
	}
}

Wenn ich über das ServiceObjekt jetzt alle PacketCategories auslese(getPacketCategoryList), kann ich ja leider nicht mehr auf die Packets zugreifen da die Session schon geschlossen ist und ich mit lazy="true" arbeite.

Gibt es eine Möglichkeit weiterhin mit DAO Objekten zu arbeiten und die Packets auslesen zu können oder muss ich direkt in den Servlets den Hibernate Zugriff durchführen und dann nach Bedarf mit Hibernate.inizialize() arbeiten?

MfG
 
Hallo!

Normalerweise wird das DAO Pattern anders angewandt. Du hast zuerst mal einen Service. Dieser Service bietet verschiedene Business Methoden an. Innerhalb dieser Business Methoden verwendest du das DAO um Pojos zu persistieren oder aus dem persistenten Speicher zu laden. Dabei könnte man beispielsweise Hibernate mit einem Transaktionsmanager Konfigurieren, so dass du beim Aufruf einer Service Methode (!) eine neue Transaktion gestartet wird. Innerhalb dieser Service Methode können nun mehrere Methoden eines DAO's aufgerufen werden die innerhalb der selben(!) Transaktion laufen. Innerhalb einer Transaktion bekommt man immer die selbe Session. Die Session öffnet man dann vor dem Aufruf der Service Methode und nach dem Aufruf schließt man sie wieder. Das Springframework bietet mit den sogenannten TransactionProxy und der Klassen HibernateTransactionManager, TransactionProxyFactoryBean und HibernateDAOSupport erstklassige Unterstützung für dieses Szenario und mal ganz neben bei -> funktioniert wunderbar :) ... außerdem muss man sich wenn man mit Springs HibernateDAOSupport arbeitet icht mehr um einen etwaigen Session-Lifecycle kümmern (open(),close()... beginTransaction(), commit(), dass übernimmt alles Spring für uns :) )

Gruß Tom
 
Hallo!

Hier mal ein "kleines" Beispiel für die Anwendung des Spring Frameworks mit Hibernate.

Gruß Tom
 

Anhänge

  • spring-example-project.zip
    25,3 KB · Aufrufe: 219
Hallo,

das Beispielist einleuchtent.

Aber wie mach ich des Wenn zum Beispiel die "PacketCategories" die "Packets" enthalten und die wiederrum "Features" usw...

Müsst ich dann im PacketCategoryService ne Methode schreiben "getAllWithPacketsWithFeaturesWith.....()" vom Typ List in der ich dann mit Hibernate.inizialize() alle Objekte inizialisieren und die List dann über das Request-Objekt an die Tiles weitergeben?

Dies wäre ziemlich umständlich da diese Hirarchie manchmal sehr weit geht. Gibts da keinen anderen Ansatz?

Gruß
e.motion
 
Hi,

du hast den DAOSupport wie Thomas schon sagt um persistente Objects zu laden oder zu "Persistieren".

Dann hast du einen Service in dem du dir die Daten anhand des DAO's besorgst und anschließend für dein Servlets (Controller) aufbereitest. Das heißt du wirst nicht das persistente Object an das Servlet leiten sondern ein Dto (DataTransferObject) oder CommandObject.

Gruß

Romsl
 
Hallo!

Das heißt du wirst nicht das persistente Object an das Servlet leiten sondern ein Dto (DataTransferObject) oder CommandObject.
In der Regel ist es aber doch so, dass man gerade wegen der Verwendung von Hibernate nicht mehr auf spezielle DTO's bzw. VO's angewiesen ist, da man die normalen Pojos als "Transportmittel" verwendet.

Gruß Tom
 

Neue Beiträge

Zurück