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>