From 82eebeaee035ff931dee783863fff387a10b0b89 Mon Sep 17 00:00:00 2001 From: Ilkka Seppala Date: Mon, 13 Apr 2015 21:22:03 +0300 Subject: [PATCH] Work on DAO example. --- dao/src/main/java/com/iluwatar/App.java | 54 +++----- dao/src/main/java/com/iluwatar/DaoBase.java | 125 ++++++++++++++++-- dao/src/main/java/com/iluwatar/Spell.java | 13 ++ dao/src/main/java/com/iluwatar/SpellDao.java | 5 + dao/src/main/java/com/iluwatar/Spellbook.java | 10 ++ .../main/java/com/iluwatar/SpellbookDao.java | 5 + dao/src/main/java/com/iluwatar/Wizard.java | 16 ++- dao/src/main/java/com/iluwatar/WizardDao.java | 5 + 8 files changed, 188 insertions(+), 45 deletions(-) create mode 100644 dao/src/main/java/com/iluwatar/SpellDao.java create mode 100644 dao/src/main/java/com/iluwatar/SpellbookDao.java create mode 100644 dao/src/main/java/com/iluwatar/WizardDao.java diff --git a/dao/src/main/java/com/iluwatar/App.java b/dao/src/main/java/com/iluwatar/App.java index 3758e41bf..2b1a3d725 100644 --- a/dao/src/main/java/com/iluwatar/App.java +++ b/dao/src/main/java/com/iluwatar/App.java @@ -2,39 +2,27 @@ package com.iluwatar; import java.util.List; -import org.hibernate.Query; -import org.hibernate.Session; -import org.hibernate.SessionFactory; -import org.hibernate.cfg.Configuration; -public class App -{ - public static void main( String[] args ) { - - SessionFactory sessionFactory = new Configuration() - .addAnnotatedClass(Wizard.class) - .addAnnotatedClass(Spellbook.class) - .addAnnotatedClass(Spell.class) - .setProperty("hibernate.dialect", "org.hibernate.dialect.H2Dialect") - .setProperty("hibernate.connection.url", "jdbc:h2:mem:test;DB_CLOSE_DELAY=-1") - .setProperty("hibernate.current_session_context_class", "thread") - .setProperty("hibernate.show_sql", "true") - .setProperty("hibernate.hbm2ddl.auto", "create") - .buildSessionFactory(); - - Session session = sessionFactory.getCurrentSession(); - session.beginTransaction(); - Wizard wizard = new Wizard(); - wizard.setFirstName("Jugga"); - Spellbook spellbook = new Spellbook(); - Spell spell = new Spell(); - spellbook.getSpells().add(spell); - wizard.getSpellbooks().add(spellbook); - session.persist(wizard); - Query query = session.createQuery("from Wizard"); - List list = query.list(); - Wizard p1 = (Wizard) list.get(0); - System.out.println(String.format("id=%d firstName=%s", p1.getId(), p1.getFirstName())); - session.getTransaction().commit(); +public class App { + public static void main( String[] args ) { + WizardDao dao = new WizardDao(); + persistData(dao); + queryData(dao); + } + + public static void persistData(WizardDao dao) { + Spell spell = new Spell("Fireball"); + Spellbook spellbook = new Spellbook("Book of fire"); + spellbook.getSpells().add(spell); + Wizard wizard = new Wizard("Jugga"); + wizard.getSpellbooks().add(spellbook); + dao.persist(wizard); + } + + public static void queryData(WizardDao dao) { + List wizards = dao.findAll(); + for (Wizard w: wizards) { + System.out.println(w); + } } } diff --git a/dao/src/main/java/com/iluwatar/DaoBase.java b/dao/src/main/java/com/iluwatar/DaoBase.java index fe8d84dcd..2257af90b 100644 --- a/dao/src/main/java/com/iluwatar/DaoBase.java +++ b/dao/src/main/java/com/iluwatar/DaoBase.java @@ -1,24 +1,131 @@ package com.iluwatar; -public abstract class DaoBase { +import java.lang.reflect.ParameterizedType; +import java.util.List; +import org.hibernate.Criteria; +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.hibernate.Transaction; +import org.hibernate.cfg.Configuration; +import org.hibernate.criterion.Restrictions; + +public abstract class DaoBase { + + @SuppressWarnings("unchecked") + protected Class persistentClass = (Class) ((ParameterizedType) getClass() + .getGenericSuperclass()).getActualTypeArguments()[0]; + + protected final SessionFactory sessionFactory = createSessionFactory(); + + private SessionFactory createSessionFactory() { + SessionFactory sessionFactory = new Configuration() + .addAnnotatedClass(Wizard.class) + .addAnnotatedClass(Spellbook.class) + .addAnnotatedClass(Spell.class) + .setProperty("hibernate.dialect", "org.hibernate.dialect.H2Dialect") + .setProperty("hibernate.connection.url", "jdbc:h2:mem:test;DB_CLOSE_DELAY=-1") + .setProperty("hibernate.current_session_context_class", "thread") + .setProperty("hibernate.show_sql", "true") + .setProperty("hibernate.hbm2ddl.auto", "create") + .buildSessionFactory(); + return sessionFactory; + } + + private Session getSession() { + return sessionFactory.openSession(); + } + E find(Long id) { - + Session session = getSession(); + Transaction tx = null; + E result = null; + try { + tx = session.beginTransaction(); + Criteria criteria = sessionFactory.getCurrentSession().createCriteria(persistentClass); + criteria.add(Restrictions.idEq(id)); + result = (E) criteria.uniqueResult(); + tx.commit(); + } + catch (Exception e) { + if (tx!=null) tx.rollback(); + throw e; + } + finally { + session.close(); + } + return result; } - void persist(E e) { - + void persist(E entity) { + Session session = getSession(); + Transaction tx = null; + try { + tx = session.beginTransaction(); + session.persist(entity); + tx.commit(); + } + catch (Exception e) { + if (tx!=null) tx.rollback(); + throw e; + } + finally { + session.close(); + } } - E merge(E e) { - + E merge(E entity) { + Session session = getSession(); + Transaction tx = null; + E result = null; + try { + tx = session.beginTransaction(); + result = (E) session.merge(entity); + tx.commit(); + } + catch (Exception e) { + if (tx!=null) tx.rollback(); + throw e; + } + finally { + session.close(); + } + return result; } - void remove(E e) { - + void delete(E entity) { + Session session = getSession(); + Transaction tx = null; + try { + tx = session.beginTransaction(); + session.delete(entity); + tx.commit(); + } + catch (Exception e) { + if (tx!=null) tx.rollback(); + throw e; + } + finally { + session.close(); + } } List findAll() { - + Session session = getSession(); + Transaction tx = null; + List result = null; + try { + tx = session.beginTransaction(); + Criteria criteria = session.createCriteria(persistentClass); + result = criteria.list(); + } + catch (Exception e) { + if (tx!=null) tx.rollback(); + throw e; + } + finally { + session.close(); + } + return result; } } diff --git a/dao/src/main/java/com/iluwatar/Spell.java b/dao/src/main/java/com/iluwatar/Spell.java index 01a78f9da..5569fa6a5 100644 --- a/dao/src/main/java/com/iluwatar/Spell.java +++ b/dao/src/main/java/com/iluwatar/Spell.java @@ -10,6 +10,14 @@ import javax.persistence.Table; public class Spell extends BaseEntity { private String name; + + public Spell() { + } + + public Spell(String name) { + this(); + this.name = name; + } @ManyToOne @JoinColumn(name="SPELLBOOK_ID_FK", referencedColumnName="ID") @@ -22,4 +30,9 @@ public class Spell extends BaseEntity { public void setName(String name) { this.name = name; } + + @Override + public String toString() { + return name; + } } diff --git a/dao/src/main/java/com/iluwatar/SpellDao.java b/dao/src/main/java/com/iluwatar/SpellDao.java new file mode 100644 index 000000000..1d96e231e --- /dev/null +++ b/dao/src/main/java/com/iluwatar/SpellDao.java @@ -0,0 +1,5 @@ +package com.iluwatar; + +public class SpellDao extends DaoBase { + +} diff --git a/dao/src/main/java/com/iluwatar/Spellbook.java b/dao/src/main/java/com/iluwatar/Spellbook.java index d10bc9c49..aab0075f6 100644 --- a/dao/src/main/java/com/iluwatar/Spellbook.java +++ b/dao/src/main/java/com/iluwatar/Spellbook.java @@ -17,6 +17,11 @@ public class Spellbook extends BaseEntity { public Spellbook() { spells = new HashSet(); } + + public Spellbook(String name) { + this(); + this.name = name; + } private String name; @@ -50,4 +55,9 @@ public class Spellbook extends BaseEntity { public void setSpells(Set spells) { this.spells = spells; } + + @Override + public String toString() { + return name; + } } diff --git a/dao/src/main/java/com/iluwatar/SpellbookDao.java b/dao/src/main/java/com/iluwatar/SpellbookDao.java new file mode 100644 index 000000000..b1b1497dc --- /dev/null +++ b/dao/src/main/java/com/iluwatar/SpellbookDao.java @@ -0,0 +1,5 @@ +package com.iluwatar; + +public class SpellbookDao extends DaoBase { + +} diff --git a/dao/src/main/java/com/iluwatar/Wizard.java b/dao/src/main/java/com/iluwatar/Wizard.java index 678d7d39e..984b5058e 100644 --- a/dao/src/main/java/com/iluwatar/Wizard.java +++ b/dao/src/main/java/com/iluwatar/Wizard.java @@ -16,17 +16,22 @@ public class Wizard extends BaseEntity { spellbooks = new HashSet(); } - private String firstName; + public Wizard(String name) { + this(); + this.name = name; + } + + private String name; @OneToMany(mappedBy = "wizard", orphanRemoval = true, cascade = CascadeType.ALL) private Set spellbooks; public String getFirstName() { - return firstName; + return name; } public void setFirstName(String firstName) { - this.firstName = firstName; + this.name = firstName; } public Set getSpellbooks() { @@ -35,5 +40,10 @@ public class Wizard extends BaseEntity { public void setSpellbooks(Set spellbooks) { this.spellbooks = spellbooks; + } + + @Override + public String toString() { + return name; } } diff --git a/dao/src/main/java/com/iluwatar/WizardDao.java b/dao/src/main/java/com/iluwatar/WizardDao.java new file mode 100644 index 000000000..f9cf92768 --- /dev/null +++ b/dao/src/main/java/com/iluwatar/WizardDao.java @@ -0,0 +1,5 @@ +package com.iluwatar; + +public class WizardDao extends DaoBase { + +}