diff --git a/src/main/java/org/tonality/model/Subscription.java b/src/main/java/org/tonality/model/Subscription.java
index 6880fa67c9e2a602301b1d7f1c2cecdfed238fa4..95ae9c33f8cb13d5306631c9a8ba880828f0f981 100644
--- a/src/main/java/org/tonality/model/Subscription.java
+++ b/src/main/java/org/tonality/model/Subscription.java
@@ -10,28 +10,22 @@ import org.hibernate.annotations.CreationTimestamp;
 import org.hibernate.annotations.UpdateTimestamp;
 import org.tonality.type.SubscriptionStatus;
 
-import org.hibernate.annotations.GenericGenerator;
 import org.hibernate.annotations.ColumnDefault;
-import org.tonality.util.HibernateUtil;
 
 import javax.persistence.*;
+import java.io.Serializable;
 import java.util.Date;
 
 @Getter
 @Setter
 @Entity(name = "subscription")
 @Table(name = "subscription")
-public class Subscription {
+@IdClass(SubscriptionId.class)
+public class Subscription implements Serializable {
     @Id
-    @GeneratedValue(generator = "increment")
-    @GenericGenerator(name = "increment", strategy = "increment")
-    @Column(name = "subscription_id")
-    private long subscriptionId;
-
-    @Column(name = "user_id", nullable = false)
     private long userId;
 
-    @Column(name = "album_id", nullable = false)
+    @Id
     private long albumId;
 
     @Column(name = "subscription_status", nullable = false)
@@ -65,69 +59,6 @@ public class Subscription {
     }
 
     public String toString() {
-        return "Subscription: " + subscriptionId + " " + userId + " " + albumId + " " + status;
-    }
-
-    // Test
-    public static void main(String[] args) {
-        SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
-
-        // Create subscription
-        try {
-            Session session = sessionFactory.openSession();
-            Transaction tx = session.beginTransaction();
-
-            Subscription subscription = new Subscription();
-            subscription.setUserId(1);
-            subscription.setAlbumId(1);
-            session.save(subscription);
-            tx.commit();
-            session.close();
-        } catch (Exception e) {
-            System.out.println("Error: " + e.getMessage());
-        }
-
-        // Get subscription from database
-        try {
-            Session session = sessionFactory.openSession();
-            Transaction tx = session.beginTransaction();
-
-            Subscription lastSubsId =  session.createQuery("from subscription order by subscriptionId desc", Subscription.class).setMaxResults(1).list().get(0);
-            Subscription subscription = session.get(Subscription.class, lastSubsId.getSubscriptionId());
-            System.out.println(subscription);
-            tx.commit();
-            session.close();
-        } catch (Exception e) {
-            System.out.println("Error: " + e.getMessage());
-        }
-
-        // Update subscription
-        try {
-            Session session = sessionFactory.openSession();
-            Transaction tx = session.beginTransaction();
-
-            Subscription firstSubsId =  session.createQuery("from subscription order by subscriptionId asc", Subscription.class).setMaxResults(1).list().get(0);
-            Subscription subscription = session.get(Subscription.class, firstSubsId.getSubscriptionId());
-            subscription.setStatus(SubscriptionStatus.ACTIVE);
-            session.update(subscription);
-            tx.commit();
-            session.close();
-        } catch (Exception e) {
-            System.out.println("Error: " + e.getMessage());
-        }
-
-        // Delete subscription
-        try {
-            Session session = sessionFactory.openSession();
-            Transaction tx = session.beginTransaction();
-
-            Subscription lastSubsId =  session.createQuery("from subscription order by subscriptionId desc", Subscription.class).setMaxResults(1).list().get(0);
-            Subscription subscription = session.get(Subscription.class, lastSubsId.getSubscriptionId());
-            session.delete(subscription);
-            tx.commit();
-            session.close();
-        } catch (Exception e) {
-            System.out.println("Error: " + e.getMessage());
-        }
+        return "Subscription: \n" + "userId :" + userId + " \nalbumId : " + albumId + " \nstatus: " + status;
     }
 }
diff --git a/src/main/java/org/tonality/model/SubscriptionId.java b/src/main/java/org/tonality/model/SubscriptionId.java
new file mode 100644
index 0000000000000000000000000000000000000000..6ad39bf9187689e396683abf5cfca1403565665c
--- /dev/null
+++ b/src/main/java/org/tonality/model/SubscriptionId.java
@@ -0,0 +1,38 @@
+package org.tonality.model;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.persistence.Column;
+import java.io.Serializable;
+
+@Getter
+@Setter
+public class SubscriptionId implements Serializable {
+    @Column(name = "user_id", nullable = false)
+    private long userId;
+
+    @Column(name = "album_id", nullable = false)
+    private long albumId;
+
+    public SubscriptionId() {}
+
+    public SubscriptionId(long userId, long albumId) {
+        this.userId = userId;
+        this.albumId = albumId;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (o instanceof SubscriptionId) {
+            SubscriptionId other = (SubscriptionId) o;
+            return (userId == other.userId) && (albumId == other.albumId);
+        }
+        return false;
+    }
+
+    @Override
+    public int hashCode() {
+        return (int) (userId + albumId);
+    }
+}
diff --git a/src/main/java/org/tonality/repository/Subscription.java b/src/main/java/org/tonality/repository/Subscription.java
new file mode 100644
index 0000000000000000000000000000000000000000..17f85c5b6220b247c6fd8c8e08f4ce0a93a417d5
--- /dev/null
+++ b/src/main/java/org/tonality/repository/Subscription.java
@@ -0,0 +1,70 @@
+package org.tonality.repository;
+
+import org.tonality.model.SubscriptionId;
+
+import java.util.List;
+import java.util.Map;
+
+public class Subscription extends BaseRepository<org.tonality.model.Subscription>{
+    private static Subscription instance = null;
+
+    @Override
+    protected Class<org.tonality.model.Subscription> getEntityClass() {
+        return org.tonality.model.Subscription.class;
+    }
+
+    public static synchronized Subscription getInstance() {
+        if (instance == null) {
+            instance = new Subscription();
+        }
+        return instance;
+    }
+
+    // Test
+    public static void main(String[] args) {
+        Subscription subscription = Subscription.getInstance();
+
+        // add
+        org.tonality.model.Subscription entity = new org.tonality.model.Subscription();
+        for (int i = 1; i < 4; i++) {
+            for (int j = 1; j < 4; j++) {
+                entity.setUserId(i);
+                entity.setAlbumId(j);
+                System.out.println(subscription.add(entity));
+            }
+        }
+
+        // update
+        entity.setStatus(org.tonality.type.SubscriptionStatus.ACTIVE);
+        System.out.println(subscription.update(entity));
+
+        // get by id
+        SubscriptionId id = new SubscriptionId(1, 1);
+        entity = subscription.getById(id);
+        System.out.println(entity);
+
+        // get by conditions
+        Map<String, Object> andConditions = new java.util.HashMap<>();
+        andConditions.put("albumId", 1);
+        java.util.Map<String, Object> orConditions = new java.util.HashMap<>();
+        java.util.List<org.tonality.model.Subscription> entities = subscription.search(andConditions, orConditions);
+        for (org.tonality.model.Subscription e : entities) {
+            System.out.println(e + "\n");
+        }
+
+        // delete by id
+        id = new SubscriptionId(1, 2);
+        System.out.println(subscription.deleteById(id));
+
+        // delete by entity
+        entity = new org.tonality.model.Subscription();
+        entity.setUserId(1);
+        entity.setAlbumId(3);
+        System.out.println("Successfully deleted : \n" + subscription.delete(entity));
+
+        // delete by conditions
+        andConditions = new java.util.HashMap<>();
+        andConditions.put("albumId", 1);
+        System.out.println("Successfully deleted : \n" + subscription.delete(andConditions));
+    }
+}