Hibernate Object relational mapping
Problemen ● Objecten moeten van en naar de database komen ● Zuivere JDBC is veel boilerplate code: – ResultSets omzetten in transfer objects – Code schrijven voor elke select, insert, update en delete
Oplossing ● Hibernate als ondersteuning voor je DAO's ● 1 object = 1 record (*) ● 1 class = 1 tabel (*) ● Mapping van class naar tabel externaliseren in.hbm.xml ● Object geörienteerde queries (HQL) als alternatief voor relationeel geörienteerde queries (SQL)
Layered architecture Presentation layer DAO layer Service layer Transfer objects MySQL Hibernate
Hibernate in Spring ● QuestionDao extend HibernateDaoSupport ● Gebruik getHibernateTemplate().* in QuestionDao ● Configureer LocalSessionFactoryBean als sessionFactory – DataSource – Properties – Mapping locations ● Injecteer de sessionFactory in DAO ● Configureer mapping bestanden
HibernateDaoSupport ● public class QuestionDaoImpl extends HibernateDaoSupport implements QuestionDao { public List findAllQuestions() { return getHibernateTemplate().loadAll(Question.class); } public void storeQuestion(Question question) { getHibernateTemplate().saveOrUpdate(question); } public void deleteQuestion(Question question) { getHibernateTemplate().delete(question); } }
SessionFactory (1) ● Definieer een DataSource in spring:
SessionFactory (2) ● org.hibernate.dialect.MySQLDialect true update...
SessionFactory (3) ●... classpath:/be/kahosl/museumapp/to/Question.hbm.xml
Mapping bestand ● Question.hbm.xml ● Demo: vergelijking met Question.java
Workshop: Hibernate ● interface be.kahosl.museumapp.dao.QuestionDao – List findAllQuestions(); – void storeQuestion(Question question); – void deleteQuestion(Question question); ● class be.kahosl.museumapp.dao.QuestionDaoImpl – Implementeer met getHibernateTemplate().* ● Configureer dataSource en sessionFactory in generalContext.xml ● Kopieer Question.hbm.xml van de website ● Configureer Question.hbm.xml ● Pas QuestionService aan en run Museumapp ● Bekijk de database met de Query browser, verifieer dat er een nieuwe tabel Question is (refresh) ● Voer uit in de Query browser: insert into question(id, text, points) values (1234, 'Where are you?', 10) ● Run Museumapp
Workshop: testdata ● create ● Injecteer questionDao in testDataCreator ● TestDataCreator implements InitializingBean – afterPropertiesSet() wordt door Spring aangeroepen nadat alle dependencies zijn geinjecteerd – Zorg ervoor dat afterPropertiesSet() elk Question testobject opslaat in de databank
Answer.hbm.xml ●
List mapping ●...
HQL ● SQL maar voor objecten, geen select: public List findAllQuestionsWithMinimumPoints( int minimumPoints) { return getHibernateTemplate().find( "from Question where points > ?", new Integer(minimumPoints) ); } ● Quick & dirty test: QuestionDao questionDao = (QuestionDao) applicationContext.getBean("questionDao"); List questionList2 = questionDao.findAllQuestionsWithMinimumPoints(8); System.out.println("Size: " + questionList2.size());
Support ● Hibernate website ● Hibernate forum ● Hibernate documentatie ● Hibernate boeken – Hibernate in action ● Demo: documentatie native SQL