diff --git a/.env.example b/.env.example
new file mode 100644
index 0000000000000000000000000000000000000000..436b0a3f9a76c8e99d9ca8b0c25135f49393b7cb
--- /dev/null
+++ b/.env.example
@@ -0,0 +1,3 @@
+DATABASE_URL=jdbc:mysql://{host??}:{port??}/{database_name??}
+DATABASE_USERNAME=
+DATABASE_PASSWORD=
\ No newline at end of file
diff --git a/src/main/java/org/tonality/db/Migration.java b/src/main/java/org/tonality/db/Migration.java
new file mode 100644
index 0000000000000000000000000000000000000000..0f3a08239f4944a028bc8a9bf0b47a3dfb4adb06
--- /dev/null
+++ b/src/main/java/org/tonality/db/Migration.java
@@ -0,0 +1,22 @@
+package org.tonality.db;
+
+import org.hibernate.SessionFactory;
+import org.tonality.util.HibernateUtil;
+
+import static java.lang.System.exit;
+
+public class Migration {
+    public static void main(String[] args) {
+        System.out.println("Migrating Data...");
+
+        try {
+            SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
+
+            System.out.println(sessionFactory);
+            System.out.println("Migration Complete!");
+        } catch (Exception e) {
+            System.out.println("Error: " + e.getMessage());
+            exit(1);
+        }
+    }
+}
diff --git a/src/main/java/org/tonality/model/Subscription.java b/src/main/java/org/tonality/model/Subscription.java
index 74deb62753d0bb6b3a556a1f5e86be247e7b550e..776313f2b5d5a749f60523e495de76614a58adef 100644
--- a/src/main/java/org/tonality/model/Subscription.java
+++ b/src/main/java/org/tonality/model/Subscription.java
@@ -1,38 +1,134 @@
 package org.tonality.model;
 
+import lombok.Getter;
+import lombok.Setter;
+
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.Transaction;
+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")
-public class Subscription {
+@Table(name = "subscription")
+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")
+    @Column(name = "user_id", nullable = false)
     private long userId;
 
-    @Column(name = "album_id")
+    @Column(name = "album_id", nullable = false)
     private long albumId;
 
-    @Column(name = "subscription_status")
+    @Column(name = "subscription_status", nullable = false)
     @Enumerated(EnumType.STRING)
+    @ColumnDefault("'PENDING'")
     private SubscriptionStatus status;
 
-    @Column(name = "created_at")
+    @Column(name = "created_at", updatable = false, nullable = false)
+    @CreationTimestamp
     @Temporal(TemporalType.TIMESTAMP)
-    @ColumnDefault("'CURRENT_TIMESTAMP'")
+    @ColumnDefault("CURRENT_TIMESTAMP(6)")
     private Date createdAt;
 
-    @Column(name = "updated_at")
+    @Column(name = "updated_at", nullable = false)
+    @UpdateTimestamp
     @Temporal(TemporalType.TIMESTAMP)
-    @ColumnDefault("'CURRENT_TIMESTAMP'")
+    @ColumnDefault("CURRENT_TIMESTAMP(6) on update CURRENT_TIMESTAMP(6)")
     private Date updatedAt;
+
+    @PrePersist
+    public void prePersist() {
+        if (status == null) {
+            status = SubscriptionStatus.PENDING;
+        }
+        updatedAt = new Date();
+    }
+
+    @PreUpdate
+    public void preUpdate() {
+        updatedAt = new Date();
+    }
+
+    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());
+        }
+    }
 }
diff --git a/src/main/java/org/tonality/util/HibernateUtil.java b/src/main/java/org/tonality/util/HibernateUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..80e00f06a4e33a5b7f479330a41e70fbc9d82ad5
--- /dev/null
+++ b/src/main/java/org/tonality/util/HibernateUtil.java
@@ -0,0 +1,24 @@
+package org.tonality.util;
+
+import lombok.Getter;
+import org.hibernate.SessionFactory;
+import org.hibernate.cfg.Configuration;
+
+public class HibernateUtil {
+    @Getter
+    private static SessionFactory sessionFactory;
+
+    static {
+        try {
+            Configuration configuration = new Configuration();
+            configuration.setProperty("hibernate.connection.url", System.getenv("DATABASE_URL"));
+            configuration.setProperty("hibernate.connection.username", System.getenv("DATABASE_USERNAME"));
+            configuration.setProperty("hibernate.connection.password", System.getenv("DATABASE_PASSWORD"));
+            configuration.configure("hibernate.cfg.xml");
+
+            sessionFactory = configuration.buildSessionFactory();
+        } catch (Exception e) {
+            System.out.println("Error: " + e.getMessage());
+        }
+    }
+}
diff --git a/src/main/resources/hibernate.cfg.xml b/src/main/resources/hibernate.cfg.xml
index c57c8a69494f1019360ecbeab8754fde3b33cb1e..33e84f12feb368c1b87a0fb6f49165def29fd9aa 100644
--- a/src/main/resources/hibernate.cfg.xml
+++ b/src/main/resources/hibernate.cfg.xml
@@ -5,13 +5,13 @@
 <hibernate-configuration>
     <session-factory>
 
-        <property name="hbm2ddl.auto">update</property>
+        <property name="hibernate.hbm2ddl.auto">update</property>
         <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
-        <property name="hibernate.connection.url">${DATABASE_URL}</property>
-        <property name="hibernate.connection.datasource">${DATABASE}</property>
-        <property name="hibernate.connection.username">${DATABASE_USERNAME}</property>
-        <property name="hibernate.connection.password">${DATABASE_PASSWORD}</property>
-        <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
+        <property name="hibernate.connection.autocommit">false</property>
+        <property name="hibernate.show_sql">true</property>
+        <property name="hibernate.format_sql">true</property>
+        <property name="hibernate.connection.pool_size">10</property>
+        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
 
         <mapping class="org.tonality.model.Subscription"/>
     </session-factory>