diff --git a/spring-jpa/src/main/java/org/baeldung/persistence/dao/AbstractJpaDAO.java b/spring-jpa/src/main/java/org/baeldung/persistence/dao/AbstractJpaDAO.java
new file mode 100644
index 0000000000..13007d9fcc
--- /dev/null
+++ b/spring-jpa/src/main/java/org/baeldung/persistence/dao/AbstractJpaDAO.java
@@ -0,0 +1,46 @@
+package org.baeldung.persistence.dao;
+
+import java.io.Serializable;
+import java.util.List;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+
+public abstract class AbstractJpaDAO<T extends Serializable> {
+
+    private Class<T> clazz;
+
+    @PersistenceContext
+    private EntityManager entityManager;
+
+    public final void setClazz(final Class<T> clazzToSet) {
+        this.clazz = clazzToSet;
+    }
+
+    public T findOne(final long id) {
+        return entityManager.find(clazz, id);
+    }
+
+    @SuppressWarnings("unchecked")
+    public List<T> findAll() {
+        return entityManager.createQuery("from " + clazz.getName()).getResultList();
+    }
+
+    public void create(final T entity) {
+        entityManager.persist(entity);
+    }
+
+    public T update(final T entity) {
+        return entityManager.merge(entity);
+    }
+
+    public void delete(final T entity) {
+        entityManager.remove(entity);
+    }
+
+    public void deleteById(final long entityId) {
+        final T entity = findOne(entityId);
+        delete(entity);
+    }
+
+}
\ No newline at end of file
diff --git a/spring-jpa/src/main/java/org/baeldung/persistence/dao/FooDao.java b/spring-jpa/src/main/java/org/baeldung/persistence/dao/FooDao.java
index 4f37afc9ff..77978c5cf2 100644
--- a/spring-jpa/src/main/java/org/baeldung/persistence/dao/FooDao.java
+++ b/spring-jpa/src/main/java/org/baeldung/persistence/dao/FooDao.java
@@ -1,60 +1,17 @@
 package org.baeldung.persistence.dao;
 
-import java.util.List;
-
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceContext;
-
 import org.baeldung.persistence.model.Foo;
 import org.springframework.stereotype.Repository;
 
-import com.google.common.base.Preconditions;
-
 @Repository
-public class FooDao implements IFooDao {
-
-    @PersistenceContext
-    private EntityManager entityManager;
+public class FooDao extends AbstractJpaDAO<Foo> implements IFooDao {
 
     public FooDao() {
         super();
+
+        setClazz(Foo.class);
     }
 
     // API
 
-    @Override
-    public Foo findOne(final long id) {
-        return entityManager.find(Foo.class, id);
-    }
-
-    @Override
-    @SuppressWarnings("unchecked")
-    public List<Foo> findAll() {
-        return entityManager.createQuery("from " + Foo.class.getName()).getResultList();
-    }
-
-    @Override
-    public void create(final Foo entity) {
-        Preconditions.checkNotNull(entity);
-        entityManager.persist(entity);
-    }
-
-    @Override
-    public Foo update(final Foo entity) {
-        Preconditions.checkNotNull(entity);
-        return entityManager.merge(entity);
-    }
-
-    @Override
-    public void delete(final Foo entity) {
-        Preconditions.checkNotNull(entity);
-        entityManager.remove(entity);
-    }
-
-    @Override
-    public void deleteById(final long entityId) {
-        final Foo entity = findOne(entityId);
-        delete(entity);
-    }
-
 }
diff --git a/spring-jpa/src/main/java/org/baeldung/persistence/model/Foo.java b/spring-jpa/src/main/java/org/baeldung/persistence/model/Foo.java
index 1e3bcc0131..8e1dee33e8 100644
--- a/spring-jpa/src/main/java/org/baeldung/persistence/model/Foo.java
+++ b/spring-jpa/src/main/java/org/baeldung/persistence/model/Foo.java
@@ -1,5 +1,7 @@
 package org.baeldung.persistence.model;
 
+import java.io.Serializable;
+
 import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.GeneratedValue;
@@ -7,7 +9,7 @@ import javax.persistence.GenerationType;
 import javax.persistence.Id;
 
 @Entity
-public class Foo {
+public class Foo implements Serializable {
 
     @Id
     @GeneratedValue(strategy = GenerationType.AUTO)