De DAO met lente en winterslaap

1. Overzicht

Dit artikel laat zien hoe implementeer de DAO met Spring en Hibernate. Bekijk het vorige Hibernate 5 with Spring-artikel voor de kernconfiguratie van de Hibernate.

2. Geen lentesjablonen meer

Vanaf Spring 3.0 en Hibernate 3.0.1, de lente HibernateTemplate is niet langer nodig om de slaapsessie te beheren. Het is nu mogelijk om gebruik te maken van contextuele sessies - sessies die rechtstreeks door Hibernate worden beheerd en actief gedurende de hele reikwijdte van een transactie.

Als gevolg hiervan is het nu een goede gewoonte om de Hibernate-API rechtstreeks te gebruiken in plaats van de HibernateTemplate. Dit zal de DAO-laagimplementatie effectief volledig loskoppelen van Spring.

2.1. Uitzonderingsvertaling zonder de HibernateTemplate

Uitzondering Vertaling was een van de verantwoordelijkheden van HibernateTemplate - het vertalen van de low-level Hibernate-uitzonderingen naar een hoger niveau, generieke Spring-uitzonderingen.

Zonder de sjabloon, dit mechanisme is nog steeds ingeschakeld en actiefvoor alle DAO's die zijn geannoteerd met de @Repository annotatie. Onder de motorkap maakt dit gebruik van een Spring bean-postprocessor die iedereen zal adviseren @Repository bonen met alle PersistenceExceptionTranslator gevonden in de lente-context.

Een ding om te onthouden is dat de vertaling van uitzonderingen proxy's gebruikt. Om Spring in staat te stellen proxy's rond de DAO-klassen te maken, mogen deze niet worden gedeclareerd als laatste.

2.2. Beheer van winterslaapsessie zonder de sjabloon

Toen Hibernate-ondersteuning voor contextuele sessies uitkwam, werd de HibernateTemplate in wezen achterhaald. In feite benadrukt de Javadoc van de klas dit aspect nu (vetgedrukt ten opzichte van het origineel):

OPMERKING: Vanaf Hibernate 3.0.1 kan transactionele Hibernate-toegangscode ook worden gecodeerd in gewone Hibernate-stijl. Overweeg daarom voor nieuw gestarte projecten om in plaats daarvan de standaard Hibernate3-stijl over te nemen voor het coderen van gegevenstoegangsobjecten, gebaseerd op {@link org.hibernate.SessionFactory # getCurrentSession ()}.

3. De DAO

We beginnen met de basis DAO - een abstracte, geparametriseerde DAO die de algemene generieke operaties ondersteunt en die we voor elke entiteit kunnen uitbreiden:

openbare abstracte klasse AbstractHibernateDAO {private Class clazz; @Autowired privé SessionFactory sessionFactory; openbare leegte setClazz (Klasse clazzToSet) {clazz = clazzToSet; } openbare T findOne (lange id) {terugkeer (T) getCurrentSession (). get (clazz, id); } openbare lijst findAll () {return getCurrentSession () .createQuery ("van" + clazz.getName ()) .list (); } openbare ongeldige opslag (T-entiteit) {getCurrentSession (). persist (entiteit); } openbare T-update (T-entiteit) {retour (T) getCurrentSession (). merge (entiteit); } openbare ongeldige verwijdering (T-entiteit) {getCurrentSession (). verwijderen (entiteit); } openbare ongeldige deleteById (lange id) {laatste T entiteit = findOne (id); verwijderen (entiteit); } beschermde laatste sessie getCurrentSession () {return sessionFactory.getCurrentSession (); }}

Een paar aspecten zijn hier interessant - zoals besproken, breidt de abstracte DAO geen enkele Spring-sjabloon uit (zoals HibernateTemplate). In plaats daarvan wordt de slaapstand SessionFactory wordt rechtstreeks in de DAO geïnjecteerd en krijgt de rol van de belangrijkste Hibernate API, via de contextual Sessie het onthult:

this.sessionFactory.getCurrentSession ();

Merk ook op dat de constructor het Klasse van de entiteit als een parameter die in de generieke bewerkingen moet worden gebruikt.

Laten we nu eens kijken een voorbeeldimplementatie van deze DAO, voor een Foo entiteit:

@Repository openbare klasse FooDAO breidt uit AbstractHibernateDAO implementeert IFooDAO {openbare FooDAO () {setClazz (Foo.class); }}

4. Conclusie

Dit artikel behandelde de configuratie en implementatie van de persistentielaag met Hibernate en Spring.

De redenen om niet langer te vertrouwen op sjablonen voor de DAO-laag werden besproken, evenals mogelijke valkuilen bij het configureren van Spring om transacties en de Hibernate-sessie te beheren. Het uiteindelijke resultaat is een lichtgewicht, schone DAO-implementatie, met bijna geen afhankelijkheid van Spring tijdens compileren.

De implementatie van dit eenvoudige project is te vinden in het github-project.