diff --git a/dao/pom.xml b/dao/pom.xml
new file mode 100644
index 000000000..40aa93005
--- /dev/null
+++ b/dao/pom.xml
@@ -0,0 +1,26 @@
+
+
+ 4.0.0
+
+ com.iluwatar
+ java-design-patterns
+ 1.0-SNAPSHOT
+
+ dao
+
+
+ org.hibernate
+ hibernate-core
+
+
+ com.h2database
+ h2
+
+
+ junit
+ junit
+ test
+
+
+
diff --git a/dao/src/main/java/com/iluwatar/App.java b/dao/src/main/java/com/iluwatar/App.java
new file mode 100644
index 000000000..3758e41bf
--- /dev/null
+++ b/dao/src/main/java/com/iluwatar/App.java
@@ -0,0 +1,40 @@
+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();
+ }
+}
diff --git a/dao/src/main/java/com/iluwatar/BaseEntity.java b/dao/src/main/java/com/iluwatar/BaseEntity.java
new file mode 100644
index 000000000..8a6f626b8
--- /dev/null
+++ b/dao/src/main/java/com/iluwatar/BaseEntity.java
@@ -0,0 +1,27 @@
+package com.iluwatar;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Version;
+
+@Entity
+public class BaseEntity {
+
+ @Id
+ @GeneratedValue
+ @Column(name = "ID")
+ private Long id;
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ @Version
+ private Long version;
+}
diff --git a/dao/src/main/java/com/iluwatar/DaoBase.java b/dao/src/main/java/com/iluwatar/DaoBase.java
new file mode 100644
index 000000000..fe8d84dcd
--- /dev/null
+++ b/dao/src/main/java/com/iluwatar/DaoBase.java
@@ -0,0 +1,24 @@
+package com.iluwatar;
+
+public abstract class DaoBase {
+
+ E find(Long id) {
+
+ }
+
+ void persist(E e) {
+
+ }
+
+ E merge(E e) {
+
+ }
+
+ void remove(E e) {
+
+ }
+
+ List findAll() {
+
+ }
+}
diff --git a/dao/src/main/java/com/iluwatar/Spell.java b/dao/src/main/java/com/iluwatar/Spell.java
new file mode 100644
index 000000000..01a78f9da
--- /dev/null
+++ b/dao/src/main/java/com/iluwatar/Spell.java
@@ -0,0 +1,25 @@
+package com.iluwatar;
+
+import javax.persistence.Entity;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+
+@Entity
+@Table(name="SPELL")
+public class Spell extends BaseEntity {
+
+ private String name;
+
+ @ManyToOne
+ @JoinColumn(name="SPELLBOOK_ID_FK", referencedColumnName="ID")
+ private Spellbook spellbook;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
diff --git a/dao/src/main/java/com/iluwatar/Spellbook.java b/dao/src/main/java/com/iluwatar/Spellbook.java
new file mode 100644
index 000000000..d10bc9c49
--- /dev/null
+++ b/dao/src/main/java/com/iluwatar/Spellbook.java
@@ -0,0 +1,53 @@
+package com.iluwatar;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+
+@Entity
+@Table(name="SPELLBOOK")
+public class Spellbook extends BaseEntity {
+
+ public Spellbook() {
+ spells = new HashSet();
+ }
+
+ private String name;
+
+ @ManyToOne
+ @JoinColumn(name="WIZARD_ID_FK", referencedColumnName="ID")
+ private Wizard wizard;
+
+ @OneToMany(mappedBy = "spellbook", orphanRemoval = true, cascade = CascadeType.ALL)
+ private Set spells;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public Wizard getWizard() {
+ return wizard;
+ }
+
+ public void setWizard(Wizard wizard) {
+ this.wizard = wizard;
+ }
+
+ public Set getSpells() {
+ return spells;
+ }
+
+ public void setSpells(Set spells) {
+ this.spells = spells;
+ }
+}
diff --git a/dao/src/main/java/com/iluwatar/Wizard.java b/dao/src/main/java/com/iluwatar/Wizard.java
new file mode 100644
index 000000000..678d7d39e
--- /dev/null
+++ b/dao/src/main/java/com/iluwatar/Wizard.java
@@ -0,0 +1,39 @@
+package com.iluwatar;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+
+@Entity
+@Table(name="WIZARD")
+public class Wizard extends BaseEntity {
+
+ public Wizard() {
+ spellbooks = new HashSet();
+ }
+
+ private String firstName;
+
+ @OneToMany(mappedBy = "wizard", orphanRemoval = true, cascade = CascadeType.ALL)
+ private Set spellbooks;
+
+ public String getFirstName() {
+ return firstName;
+ }
+
+ public void setFirstName(String firstName) {
+ this.firstName = firstName;
+ }
+
+ public Set getSpellbooks() {
+ return spellbooks;
+ }
+
+ public void setSpellbooks(Set spellbooks) {
+ this.spellbooks = spellbooks;
+ }
+}
diff --git a/dao/src/test/java/com/iluwatar/AppTest.java b/dao/src/test/java/com/iluwatar/AppTest.java
new file mode 100644
index 000000000..a625cec70
--- /dev/null
+++ b/dao/src/test/java/com/iluwatar/AppTest.java
@@ -0,0 +1,4 @@
+package com.iluwatar;
+
+public class AppTest {
+}
diff --git a/pom.xml b/pom.xml
index 33b34296f..4816f46d2 100644
--- a/pom.xml
+++ b/pom.xml
@@ -9,6 +9,9 @@
UTF-8
+ 5.0.0.Beta1
+ 1.4.187
+ 4.12
abstract-factory
@@ -46,14 +49,25 @@
intercepting-filter
poison-pill
lazy-loading
+ dao
+
+ org.hibernate
+ hibernate-core
+ ${hibernate.version}
+
+
+ com.h2database
+ h2
+ ${h2.version}
+
junit
junit
- 4.11
+ ${junit.version}
test