From b1dfb6322eaadbc1fede372cbbbd62efc25331a0 Mon Sep 17 00:00:00 2001 From: Sambo Chea Date: Wed, 10 Jun 2020 19:38:38 +0700 Subject: [PATCH] Add domain for users, posts, comments --- build.gradle | 30 ++++++------ .../com/cubetiqs/demo/DemoApplication.java | 10 +++- .../com/cubetiqs/demo/domain/BaseEntity.java | 47 +++++++++++++++++++ .../cubetiqs/demo/domain/CommentEntity.java | 27 +++++++++++ .../com/cubetiqs/demo/domain/PostEntity.java | 29 ++++++++++++ .../com/cubetiqs/demo/domain/UserEntity.java | 21 +++++++++ 6 files changed, 148 insertions(+), 16 deletions(-) create mode 100644 src/main/java/com/cubetiqs/demo/domain/BaseEntity.java create mode 100644 src/main/java/com/cubetiqs/demo/domain/CommentEntity.java create mode 100644 src/main/java/com/cubetiqs/demo/domain/PostEntity.java create mode 100644 src/main/java/com/cubetiqs/demo/domain/UserEntity.java diff --git a/build.gradle b/build.gradle index 305665b..b55a239 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ plugins { - id 'org.springframework.boot' version '2.3.0.RELEASE' - id 'io.spring.dependency-management' version '1.0.9.RELEASE' - id 'java' + id 'org.springframework.boot' version '2.3.0.RELEASE' + id 'io.spring.dependency-management' version '1.0.9.RELEASE' + id 'java' } group = 'com.cubetiqs' @@ -9,23 +9,23 @@ version = '0.0.1-SNAPSHOT' sourceCompatibility = '1.8' repositories { - mavenCentral() + mavenCentral() } dependencies { - implementation 'org.springframework.boot:spring-boot-starter-data-jpa' - implementation 'org.springframework.boot:spring-boot-starter-web' - implementation 'io.springfox:springfox-swagger2:2.9.2' - implementation 'io.springfox:springfox-swagger-ui:2.9.2' + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'io.springfox:springfox-swagger2:2.9.2' + implementation 'io.springfox:springfox-swagger-ui:2.9.2' - runtimeOnly 'org.postgresql:postgresql' - compileOnly 'org.projectlombok:lombok' - annotationProcessor 'org.projectlombok:lombok' - testImplementation('org.springframework.boot:spring-boot-starter-test') { - exclude group: 'org.junit.vintage', module: 'junit-vintage-engine' - } + runtimeOnly 'org.postgresql:postgresql' + compileOnly 'org.projectlombok:lombok' + annotationProcessor 'org.projectlombok:lombok' + testImplementation('org.springframework.boot:spring-boot-starter-test') { + exclude group: 'org.junit.vintage', module: 'junit-vintage-engine' + } } test { - useJUnitPlatform() + useJUnitPlatform() } diff --git a/src/main/java/com/cubetiqs/demo/DemoApplication.java b/src/main/java/com/cubetiqs/demo/DemoApplication.java index 8392e09..71a3584 100644 --- a/src/main/java/com/cubetiqs/demo/DemoApplication.java +++ b/src/main/java/com/cubetiqs/demo/DemoApplication.java @@ -1,13 +1,21 @@ package com.cubetiqs.demo; +import com.cubetiqs.demo.domain.UserEntity; +import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication -public class DemoApplication { +public class DemoApplication implements CommandLineRunner { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } + + @Override + public void run(String... args) throws Exception { + UserEntity userEntity = new UserEntity(); + userEntity.setEmail("a@gm.com"); + } } diff --git a/src/main/java/com/cubetiqs/demo/domain/BaseEntity.java b/src/main/java/com/cubetiqs/demo/domain/BaseEntity.java new file mode 100644 index 0000000..66747d0 --- /dev/null +++ b/src/main/java/com/cubetiqs/demo/domain/BaseEntity.java @@ -0,0 +1,47 @@ +package com.cubetiqs.demo.domain; + +import org.springframework.data.domain.Persistable; + +import javax.persistence.*; +import java.io.Serializable; +import java.util.Date; + +@MappedSuperclass +public class BaseEntity implements Serializable, Persistable { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private ID id; + + @Column(name = "created_date") + @Temporal(TemporalType.TIMESTAMP) + private Date createdDate; + + public void setId(ID id) { + this.id = id; + } + + @Override + public ID getId() { + return id; + } + + @Override + public boolean isNew() { + return id == null; + } + + public Date getCreatedDate() { + return createdDate; + } + + public void setCreatedDate(Date createdDate) { + this.createdDate = createdDate; + } + + @PrePersist + public void beforeSave() { + if (createdDate == null) { + createdDate = new Date(); + } + } +} diff --git a/src/main/java/com/cubetiqs/demo/domain/CommentEntity.java b/src/main/java/com/cubetiqs/demo/domain/CommentEntity.java new file mode 100644 index 0000000..a7a5654 --- /dev/null +++ b/src/main/java/com/cubetiqs/demo/domain/CommentEntity.java @@ -0,0 +1,27 @@ +package com.cubetiqs.demo.domain; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +import javax.persistence.*; + +@Entity +@Table(name = "comments") +@EqualsAndHashCode(callSuper = true) +@Data +@NoArgsConstructor +@AllArgsConstructor +public class CommentEntity extends BaseEntity { + @Column(columnDefinition = "TEXT") + private String contents; + + @ManyToOne(fetch = FetchType.EAGER, cascade = {CascadeType.REFRESH, CascadeType.DETACH}) + @JoinColumn(name = "post_id") + private PostEntity post; + + @ManyToOne(fetch = FetchType.EAGER, cascade = {CascadeType.REFRESH, CascadeType.DETACH}) + @JoinColumn(name = "user_id") + private UserEntity user; +} diff --git a/src/main/java/com/cubetiqs/demo/domain/PostEntity.java b/src/main/java/com/cubetiqs/demo/domain/PostEntity.java new file mode 100644 index 0000000..9a96c20 --- /dev/null +++ b/src/main/java/com/cubetiqs/demo/domain/PostEntity.java @@ -0,0 +1,29 @@ +package com.cubetiqs.demo.domain; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +import javax.persistence.*; +import java.util.Collection; +import java.util.List; + +@Entity +@Table(name = "posts") +@EqualsAndHashCode(callSuper = true) +@Data +@NoArgsConstructor +@AllArgsConstructor +public class PostEntity extends BaseEntity { + @Column + private String title; + @Column(columnDefinition = "TEXT") + private String contents; + @ManyToOne(fetch = FetchType.EAGER, cascade = {CascadeType.REFRESH, CascadeType.DETACH}) + @JoinColumn(name = "user_id") + private UserEntity user; + + @OneToMany(mappedBy = "post", fetch = FetchType.EAGER, cascade = {CascadeType.ALL}, orphanRemoval = true) + private Collection comments; +} diff --git a/src/main/java/com/cubetiqs/demo/domain/UserEntity.java b/src/main/java/com/cubetiqs/demo/domain/UserEntity.java new file mode 100644 index 0000000..f9b39c8 --- /dev/null +++ b/src/main/java/com/cubetiqs/demo/domain/UserEntity.java @@ -0,0 +1,21 @@ +package com.cubetiqs.demo.domain; + +import lombok.*; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Table; + +@Entity +@Table(name = "users") +@EqualsAndHashCode(callSuper = true) +@Data +@NoArgsConstructor +@AllArgsConstructor +public class UserEntity extends BaseEntity { + @Column(name = "email", length = 100, unique = true, nullable = false) + private String email; + + @Column(length = 100) + private String password; +}