diff --git a/src/main/java/org/tonality/repository/BaseRepository.java b/src/main/java/org/tonality/repository/BaseRepository.java
new file mode 100644
index 0000000000000000000000000000000000000000..1c89906021a3f58c448d2f3233e5450df851f17d
--- /dev/null
+++ b/src/main/java/org/tonality/repository/BaseRepository.java
@@ -0,0 +1,167 @@
+package org.tonality.repository;
+
+import oracle.ucp.proxy.annotation.Pre;
+import org.hibernate.SessionFactory;
+import org.tonality.util.HibernateUtil;
+
+import javax.persistence.EntityManager;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+import java.util.List;
+import java.util.Map;
+
+public abstract class BaseRepository<T> {
+    protected abstract Class<T> getEntityClass();
+    protected boolean add(T entity) {
+        try {
+            SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
+            EntityManager entityManager = sessionFactory.createEntityManager();
+            entityManager.getTransaction().begin();
+            entityManager.persist(entity);
+            entityManager.getTransaction().commit();
+            entityManager.close();
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+    protected boolean update(T entity) {
+        try {
+            SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
+            EntityManager entityManager = sessionFactory.createEntityManager();
+            entityManager.getTransaction().begin();
+            entityManager.persist(entity);
+            entityManager.getTransaction().commit();
+            entityManager.close();
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    // get by id
+    protected <V> T getById(V id) {
+        try {
+            SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
+            EntityManager entityManager = sessionFactory.createEntityManager();
+            entityManager.getTransaction().begin();
+            T entity = entityManager.find(this.getEntityClass(), id);
+            entityManager.getTransaction().commit();
+            entityManager.close();
+            return entity;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    // get by conditions
+    protected List<T> search(Map<String, Object>andConditions, Map<String, Object> orConditions) {
+        try {
+            SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
+            EntityManager entityManager = sessionFactory.createEntityManager();
+            entityManager.getTransaction().begin();
+            CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
+            CriteriaQuery<T> criteriaQuery = criteriaBuilder.createQuery(this.getEntityClass());
+            Root<T> root = criteriaQuery.from(this.getEntityClass());
+
+            // and conditions
+            Predicate andPredicate = criteriaBuilder.conjunction();
+            for (Map.Entry<String, Object> entry : andConditions.entrySet()) {
+                andPredicate = criteriaBuilder.and(andPredicate, criteriaBuilder.equal(root.get(entry.getKey()), entry.getValue()));
+            }
+
+            // or conditions
+            Predicate orPredicate = criteriaBuilder.disjunction();
+            for (Map.Entry<String, Object> entry : orConditions.entrySet()) {
+                orPredicate = criteriaBuilder.or(orPredicate, criteriaBuilder.equal(root.get(entry.getKey()), entry.getValue()));
+            }
+
+            if (andPredicate.getExpressions().size() > 0 && orPredicate.getExpressions().size() > 0) {
+                criteriaQuery.where(criteriaBuilder.and(andPredicate, orPredicate));
+            } else if (andPredicate.getExpressions().size() > 0) {
+                criteriaQuery.where(andPredicate);
+            } else if (orPredicate.getExpressions().size() > 0) {
+                criteriaQuery.where(orPredicate);
+            }
+            List<T> entities = entityManager.createQuery(criteriaQuery).getResultList();
+            entityManager.getTransaction().commit();
+            entityManager.close();
+            return entities;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    // delete by id
+    protected <V> boolean deleteById(V id) {
+        try {
+            SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
+            EntityManager entityManager = sessionFactory.createEntityManager();
+            entityManager.getTransaction().begin();
+            T entity = entityManager.find(this.getEntityClass(), id);
+            entityManager.remove(entity);
+            entityManager.getTransaction().commit();
+            entityManager.close();
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    // delete by entity
+    protected boolean delete(T entity) {
+        try {
+            SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
+            EntityManager entityManager = sessionFactory.createEntityManager();
+            entityManager.getTransaction().begin();
+            entityManager.remove(entity);
+            entityManager.getTransaction().commit();
+            entityManager.close();
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    // delete by conditions
+    protected boolean delete(Map<String, Object> conditions) {
+        try {
+            SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
+            EntityManager entityManager = sessionFactory.createEntityManager();
+            entityManager.getTransaction().begin();
+            CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
+            CriteriaQuery<T> criteriaQuery = criteriaBuilder.createQuery(this.getEntityClass());
+            Root<T> root = criteriaQuery.from(this.getEntityClass());
+
+            // and conditions
+            Predicate predicate = criteriaBuilder.conjunction();
+            for (Map.Entry<String, Object> entry : conditions.entrySet()) {
+                predicate = criteriaBuilder.and(predicate, criteriaBuilder.equal(root.get(entry.getKey()), entry.getValue()));
+            }
+
+            if (predicate.getExpressions().size() > 0) {
+                criteriaQuery.where(predicate);
+            }
+            List<T> entities = entityManager.createQuery(criteriaQuery).getResultList();
+            for (T entity : entities) {
+                entityManager.remove(entity);
+            }
+            entityManager.getTransaction().commit();
+            entityManager.close();
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+}
+
+