diff --git a/jpa-one-to-many-demo/Hibernate one to many mapping example.postman_collection.json b/jpa-one-to-many-demo/Hibernate one to many mapping example.postman_collection.json new file mode 100644 index 0000000..e535dc1 --- /dev/null +++ b/jpa-one-to-many-demo/Hibernate one to many mapping example.postman_collection.json @@ -0,0 +1,183 @@ +{ + "id": "50f06778-83f3-3359-8bc5-cc3d0bdf582d", + "name": "Hibernate one to many mapping example", + "description": "", + "order": [ + "15826d80-cf0a-78c9-1acf-36fef67d89fc", + "095e803e-c84e-6e66-c785-83930184de23", + "1086cdf7-fb9e-305a-1118-b4a1e3335453", + "df740598-560e-5b22-8c65-f719411d1d24" + ], + "folders": [], + "folders_order": [], + "timestamp": 1569687636029, + "owner": "2037757", + "public": false, + "requests": [ + { + "id": "095e803e-c84e-6e66-c785-83930184de23", + "headers": "Content-Type: application/json\n", + "headerData": [ + { + "key": "Content-Type", + "value": "application/json", + "description": "", + "enabled": true + } + ], + "url": "localhost:8080/v1/posts?page=0&size=3&sort=createdAt,desc", + "queryParams": [ + { + "key": "page", + "value": "0", + "equals": true, + "description": "", + "enabled": true + }, + { + "key": "size", + "value": "3", + "equals": true, + "description": "", + "enabled": true + }, + { + "key": "sort", + "value": "createdAt,desc", + "equals": true, + "description": "", + "enabled": true + } + ], + "preRequestScript": null, + "pathVariables": {}, + "pathVariableData": [], + "method": "GET", + "data": null, + "dataMode": "params", + "version": 2, + "tests": null, + "currentHelper": "normal", + "helperAttributes": {}, + "time": 1569689480899, + "name": "Retrieve all posts", + "description": "", + "collectionId": "50f06778-83f3-3359-8bc5-cc3d0bdf582d", + "responses": [] + }, + { + "id": "1086cdf7-fb9e-305a-1118-b4a1e3335453", + "headers": "Content-Type: application/json\n", + "headerData": [ + { + "key": "Content-Type", + "value": "application/json", + "description": "", + "enabled": true + } + ], + "url": "localhost:8080/v1/posts/1/comments", + "queryParams": [], + "pathVariables": {}, + "pathVariableData": [], + "preRequestScript": null, + "method": "POST", + "collectionId": "50f06778-83f3-3359-8bc5-cc3d0bdf582d", + "data": [], + "dataMode": "raw", + "name": "Create comment", + "description": "", + "descriptionFormat": "html", + "time": 1569689148814, + "version": 2, + "responses": [], + "tests": null, + "currentHelper": "normal", + "helperAttributes": {}, + "rawModeData": "{\n\t\"text\": \"it's nice post\"\n}" + }, + { + "id": "15826d80-cf0a-78c9-1acf-36fef67d89fc", + "headers": "Content-Type: application/json\n", + "headerData": [ + { + "key": "Content-Type", + "value": "application/json", + "description": "", + "enabled": true + } + ], + "url": "localhost:8080/v1/posts", + "queryParams": [], + "pathVariables": {}, + "pathVariableData": [], + "preRequestScript": null, + "method": "POST", + "collectionId": "50f06778-83f3-3359-8bc5-cc3d0bdf582d", + "data": [], + "dataMode": "raw", + "name": "Create post", + "description": "", + "descriptionFormat": "html", + "time": 1569687903992, + "version": 2, + "responses": [], + "tests": null, + "currentHelper": "normal", + "helperAttributes": {}, + "rawModeData": "{\n\t\"title\": \"post 1\",\n\t\"description\": \"post 1 description\",\n\t\"content\": \"post 1 content\"\n}" + }, + { + "id": "df740598-560e-5b22-8c65-f719411d1d24", + "headers": "Content-Type: application/json\n", + "headerData": [ + { + "key": "Content-Type", + "value": "application/json", + "description": "", + "enabled": true + } + ], + "url": "localhost:8080/v1/posts/1/comments?page=0&size=3&sort=createdAt,desc", + "queryParams": [ + { + "key": "page", + "value": "0", + "equals": true, + "description": "", + "enabled": true + }, + { + "key": "size", + "value": "3", + "equals": true, + "description": "", + "enabled": true + }, + { + "key": "sort", + "value": "createdAt,desc", + "equals": true, + "description": "", + "enabled": true + } + ], + "pathVariables": {}, + "pathVariableData": [], + "preRequestScript": null, + "method": "GET", + "collectionId": "50f06778-83f3-3359-8bc5-cc3d0bdf582d", + "data": null, + "dataMode": "params", + "name": "Retrieve all comments of a post", + "description": "", + "descriptionFormat": "html", + "time": 1569689513143, + "version": 2, + "responses": [], + "tests": null, + "currentHelper": "normal", + "helperAttributes": {} + } + ] +} \ No newline at end of file diff --git a/jpa-one-to-many-demo/pom.xml b/jpa-one-to-many-demo/pom.xml index 69e2760..8609bc2 100644 --- a/jpa-one-to-many-demo/pom.xml +++ b/jpa-one-to-many-demo/pom.xml @@ -38,6 +38,13 @@ mysql mysql-connector-java runtime + 8.0.13 + + + + org.hibernate + hibernate-core + 5.3.1.Final org.springframework.boot diff --git a/jpa-one-to-many-demo/src/main/java/com/example/jpa/JpaOneToManyDemoApplication.java b/jpa-one-to-many-demo/src/main/java/com/amit/jpa/JpaOneToManyDemoApplication.java similarity index 87% rename from jpa-one-to-many-demo/src/main/java/com/example/jpa/JpaOneToManyDemoApplication.java rename to jpa-one-to-many-demo/src/main/java/com/amit/jpa/JpaOneToManyDemoApplication.java index cdf57c7..821940a 100644 --- a/jpa-one-to-many-demo/src/main/java/com/example/jpa/JpaOneToManyDemoApplication.java +++ b/jpa-one-to-many-demo/src/main/java/com/amit/jpa/JpaOneToManyDemoApplication.java @@ -1,9 +1,13 @@ -package com.example.jpa; +package com.amit.jpa; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.data.jpa.repository.config.EnableJpaAuditing; - +/** +* +* @author Amit Patil +* +**/ @SpringBootApplication @EnableJpaAuditing public class JpaOneToManyDemoApplication { diff --git a/jpa-one-to-many-demo/src/main/java/com/example/jpa/controller/CommentController.java b/jpa-one-to-many-demo/src/main/java/com/amit/jpa/controller/CommentController.java similarity index 89% rename from jpa-one-to-many-demo/src/main/java/com/example/jpa/controller/CommentController.java rename to jpa-one-to-many-demo/src/main/java/com/amit/jpa/controller/CommentController.java index d8723d4..4511b8e 100644 --- a/jpa-one-to-many-demo/src/main/java/com/example/jpa/controller/CommentController.java +++ b/jpa-one-to-many-demo/src/main/java/com/amit/jpa/controller/CommentController.java @@ -1,9 +1,10 @@ -package com.example.jpa.controller; +package com.amit.jpa.controller; + +import com.amit.jpa.exception.ResourceNotFoundException; +import com.amit.jpa.model.Comment; +import com.amit.jpa.repository.CommentRepository; +import com.amit.jpa.repository.PostRepository; -import com.example.jpa.exception.ResourceNotFoundException; -import com.example.jpa.model.Comment; -import com.example.jpa.repository.CommentRepository; -import com.example.jpa.repository.PostRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; @@ -11,8 +12,13 @@ import org.springframework.web.bind.annotation.*; import javax.validation.Valid; - +/** +* +* @author Amit Patil +* +**/ @RestController +@RequestMapping("/v1") public class CommentController { @Autowired diff --git a/jpa-one-to-many-demo/src/main/java/com/example/jpa/controller/PostController.java b/jpa-one-to-many-demo/src/main/java/com/amit/jpa/controller/PostController.java similarity index 87% rename from jpa-one-to-many-demo/src/main/java/com/example/jpa/controller/PostController.java rename to jpa-one-to-many-demo/src/main/java/com/amit/jpa/controller/PostController.java index 23dca85..d1d2b9e 100644 --- a/jpa-one-to-many-demo/src/main/java/com/example/jpa/controller/PostController.java +++ b/jpa-one-to-many-demo/src/main/java/com/amit/jpa/controller/PostController.java @@ -1,8 +1,9 @@ -package com.example.jpa.controller; +package com.amit.jpa.controller; + +import com.amit.jpa.exception.ResourceNotFoundException; +import com.amit.jpa.model.Post; +import com.amit.jpa.repository.PostRepository; -import com.example.jpa.exception.ResourceNotFoundException; -import com.example.jpa.model.Post; -import com.example.jpa.repository.PostRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; @@ -10,8 +11,13 @@ import org.springframework.web.bind.annotation.*; import javax.validation.Valid; - +/** +* +* @author Amit Patil +* +**/ @RestController +@RequestMapping("/v1") public class PostController { @Autowired diff --git a/jpa-one-to-many-demo/src/main/java/com/example/jpa/exception/ResourceNotFoundException.java b/jpa-one-to-many-demo/src/main/java/com/amit/jpa/exception/ResourceNotFoundException.java similarity index 69% rename from jpa-one-to-many-demo/src/main/java/com/example/jpa/exception/ResourceNotFoundException.java rename to jpa-one-to-many-demo/src/main/java/com/amit/jpa/exception/ResourceNotFoundException.java index 8e2cf36..b4acef4 100644 --- a/jpa-one-to-many-demo/src/main/java/com/example/jpa/exception/ResourceNotFoundException.java +++ b/jpa-one-to-many-demo/src/main/java/com/amit/jpa/exception/ResourceNotFoundException.java @@ -1,11 +1,20 @@ -package com.example.jpa.exception; +package com.amit.jpa.exception; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ResponseStatus; - +/** +* +* @author Amit Patil +* +**/ @ResponseStatus(HttpStatus.NOT_FOUND) public class ResourceNotFoundException extends RuntimeException { - public ResourceNotFoundException() { + /** + * + */ + private static final long serialVersionUID = -6284714764240841538L; + + public ResourceNotFoundException() { super(); } diff --git a/jpa-one-to-many-demo/src/main/java/com/example/jpa/model/AuditModel.java b/jpa-one-to-many-demo/src/main/java/com/amit/jpa/model/AuditModel.java similarity index 74% rename from jpa-one-to-many-demo/src/main/java/com/example/jpa/model/AuditModel.java rename to jpa-one-to-many-demo/src/main/java/com/amit/jpa/model/AuditModel.java index 4c8eda7..239a448 100644 --- a/jpa-one-to-many-demo/src/main/java/com/example/jpa/model/AuditModel.java +++ b/jpa-one-to-many-demo/src/main/java/com/amit/jpa/model/AuditModel.java @@ -1,15 +1,24 @@ -package com.example.jpa.model; +package com.amit.jpa.model; + +import java.io.Serializable; +import java.util.Date; + +import javax.persistence.Column; +import javax.persistence.EntityListeners; +import javax.persistence.MappedSuperclass; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import org.springframework.data.annotation.CreatedDate; import org.springframework.data.annotation.LastModifiedDate; import org.springframework.data.jpa.domain.support.AuditingEntityListener; -import javax.persistence.*; -import javax.validation.constraints.NotNull; -import java.io.Serializable; -import java.util.Date; - +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +/** +* +* @author Amit Patil +* +**/ @MappedSuperclass @EntityListeners(AuditingEntityListener.class) @JsonIgnoreProperties( @@ -17,7 +26,12 @@ allowGetters = true ) public abstract class AuditModel implements Serializable { - @Temporal(TemporalType.TIMESTAMP) + /** + * + */ + private static final long serialVersionUID = -3515832039273653354L; + + @Temporal(TemporalType.TIMESTAMP) @Column(name = "created_at", nullable = false, updatable = false) @CreatedDate private Date createdAt; diff --git a/jpa-one-to-many-demo/src/main/java/com/amit/jpa/model/Comment.java b/jpa-one-to-many-demo/src/main/java/com/amit/jpa/model/Comment.java new file mode 100644 index 0000000..760a412 --- /dev/null +++ b/jpa-one-to-many-demo/src/main/java/com/amit/jpa/model/Comment.java @@ -0,0 +1,59 @@ +package com.amit.jpa.model; + +import com.fasterxml.jackson.annotation.*; + +import javax.persistence.*; +import javax.validation.constraints.NotNull; + +import org.hibernate.annotations.OnDelete; +import org.hibernate.annotations.OnDeleteAction; + +/** + * + * @author Amit Patil + * + **/ +@Entity +@Table(name = "comments") +public class Comment extends AuditModel { + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceComment") + @SequenceGenerator(name = "sequenceComment", allocationSize = 10) + private Long id; + + @NotNull + @Lob + private String text; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn(name = "post_id", nullable = false) + @OnDelete(action = OnDeleteAction.CASCADE) + @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id") + @JsonIdentityReference(alwaysAsId = true) + @JsonProperty("post_id") + private Post post; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getText() { + return text; + } + + public void setText(String text) { + this.text = text; + } + + public Post getPost() { + return post; + } + + public void setPost(Post post) { + this.post = post; + } +} diff --git a/jpa-one-to-many-demo/src/main/java/com/amit/jpa/model/Post.java b/jpa-one-to-many-demo/src/main/java/com/amit/jpa/model/Post.java new file mode 100644 index 0000000..3cbc642 --- /dev/null +++ b/jpa-one-to-many-demo/src/main/java/com/amit/jpa/model/Post.java @@ -0,0 +1,65 @@ +package com.amit.jpa.model; + +import javax.persistence.*; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +/** + * + * @author Amit Patil + * + **/ +@Entity +@Table(name = "posts") +public class Post extends AuditModel { + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequencePost") + @SequenceGenerator(name = "sequencePost", allocationSize = 10) + private Long id; + + @NotNull + @Size(max = 100) + @Column(unique = true) + private String title; + + @NotNull + @Size(max = 250) + private String description; + + @NotNull + @Lob +// @Column(name = "content", nullable = false, columnDefinition = "CLOB") + private String content; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } +} diff --git a/jpa-one-to-many-demo/src/main/java/com/example/jpa/repository/CommentRepository.java b/jpa-one-to-many-demo/src/main/java/com/amit/jpa/repository/CommentRepository.java similarity index 78% rename from jpa-one-to-many-demo/src/main/java/com/example/jpa/repository/CommentRepository.java rename to jpa-one-to-many-demo/src/main/java/com/amit/jpa/repository/CommentRepository.java index 15684d3..9bd1fce 100644 --- a/jpa-one-to-many-demo/src/main/java/com/example/jpa/repository/CommentRepository.java +++ b/jpa-one-to-many-demo/src/main/java/com/amit/jpa/repository/CommentRepository.java @@ -1,16 +1,18 @@ -package com.example.jpa.repository; +package com.amit.jpa.repository; -import com.example.jpa.model.Comment; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; -import java.util.Optional; +import com.amit.jpa.model.Comment; +import java.util.Optional; /** - * Created by rajeevkumarsingh on 21/11/17. - */ +* +* @author Amit Patil +* +**/ @Repository public interface CommentRepository extends JpaRepository { Page findByPostId(Long postId, Pageable pageable); diff --git a/jpa-one-to-many-demo/src/main/java/com/example/jpa/repository/PostRepository.java b/jpa-one-to-many-demo/src/main/java/com/amit/jpa/repository/PostRepository.java similarity index 62% rename from jpa-one-to-many-demo/src/main/java/com/example/jpa/repository/PostRepository.java rename to jpa-one-to-many-demo/src/main/java/com/amit/jpa/repository/PostRepository.java index 4de0b39..4377898 100644 --- a/jpa-one-to-many-demo/src/main/java/com/example/jpa/repository/PostRepository.java +++ b/jpa-one-to-many-demo/src/main/java/com/amit/jpa/repository/PostRepository.java @@ -1,12 +1,14 @@ -package com.example.jpa.repository; +package com.amit.jpa.repository; -import com.example.jpa.model.Post; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; +import com.amit.jpa.model.Post; /** - * Created by rajeevkumarsingh on 21/11/17. - */ +* +* @author Amit Patil +* +**/ @Repository public interface PostRepository extends JpaRepository { diff --git a/jpa-one-to-many-demo/src/main/java/com/example/jpa/model/Comment.java b/jpa-one-to-many-demo/src/main/java/com/example/jpa/model/Comment.java deleted file mode 100644 index 29f33bb..0000000 --- a/jpa-one-to-many-demo/src/main/java/com/example/jpa/model/Comment.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.example.jpa.model; - -import com.fasterxml.jackson.annotation.*; - -import javax.persistence.*; -import javax.validation.constraints.NotNull; - -import org.hibernate.annotations.OnDelete; -import org.hibernate.annotations.OnDeleteAction; - -/** - * Created by rajeevkumarsingh on 21/11/17. - */ -@Entity -@Table(name = "comments") -public class Comment extends AuditModel { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @NotNull - @Lob - private String text; - - @ManyToOne(fetch = FetchType.LAZY, optional = false) - @JoinColumn(name = "post_id", nullable = false) - @OnDelete(action = OnDeleteAction.CASCADE) - @JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id") - @JsonIdentityReference(alwaysAsId=true) - @JsonProperty("post_id") - private Post post; - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getText() { - return text; - } - - public void setText(String text) { - this.text = text; - } - - public Post getPost() { - return post; - } - - public void setPost(Post post) { - this.post = post; - } -} diff --git a/jpa-one-to-many-demo/src/main/java/com/example/jpa/model/Post.java b/jpa-one-to-many-demo/src/main/java/com/example/jpa/model/Post.java deleted file mode 100644 index 05f3461..0000000 --- a/jpa-one-to-many-demo/src/main/java/com/example/jpa/model/Post.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.example.jpa.model; - -import javax.persistence.*; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Size; - -/** - * Created by rajeevkumarsingh on 21/11/17. - */ -@Entity -@Table(name = "posts") -public class Post extends AuditModel { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @NotNull - @Size(max = 100) - @Column(unique = true) - private String title; - - @NotNull - @Size(max = 250) - private String description; - - @NotNull - @Lob - private String content; - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - public String getContent() { - return content; - } - - public void setContent(String content) { - this.content = content; - } -} diff --git a/jpa-one-to-many-demo/src/main/resources/META-INF/orm.xml b/jpa-one-to-many-demo/src/main/resources/META-INF/orm.xml new file mode 100644 index 0000000..0a0b960 --- /dev/null +++ b/jpa-one-to-many-demo/src/main/resources/META-INF/orm.xml @@ -0,0 +1,17 @@ + + + + com.amit.jpa.model + + + + + + + + \ No newline at end of file diff --git a/jpa-one-to-many-demo/src/main/resources/application.properties b/jpa-one-to-many-demo/src/main/resources/application.properties index 1dae201..bf46ce4 100644 --- a/jpa-one-to-many-demo/src/main/resources/application.properties +++ b/jpa-one-to-many-demo/src/main/resources/application.properties @@ -1,15 +1,18 @@ # DATASOURCE (DataSourceAutoConfiguration & DataSourceProperties) spring.datasource.url=jdbc:mysql://localhost:3306/jpa_one_to_many_demo?useSSL=false spring.datasource.username=root -spring.datasource.password=callicoder +spring.datasource.password=root +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver # Hibernate # The SQL dialect makes Hibernate generate better SQL for the chosen database -spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5InnoDBDialect +spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL8Dialect +spring.jpa.show-sql=true +spring.jpa.properties.hibernate.format_sql=true # Hibernate ddl auto (create, create-drop, validate, update) spring.jpa.hibernate.ddl-auto = update -logging.level.org.hibernate.SQL=DEBUG -logging.level.org.hibernate.type=TRACE \ No newline at end of file +#logging.level.org.hibernate.SQL=DEBUG +#logging.level.org.hibernate.type=TRACE \ No newline at end of file diff --git a/jpa-one-to-many-demo/src/test/java/com/example/jpa/JpaOneToManyDemoApplicationTests.java b/jpa-one-to-many-demo/src/test/java/com/amit/jpa/JpaOneToManyDemoApplicationTests.java similarity index 85% rename from jpa-one-to-many-demo/src/test/java/com/example/jpa/JpaOneToManyDemoApplicationTests.java rename to jpa-one-to-many-demo/src/test/java/com/amit/jpa/JpaOneToManyDemoApplicationTests.java index ee4cfde..efd769d 100644 --- a/jpa-one-to-many-demo/src/test/java/com/example/jpa/JpaOneToManyDemoApplicationTests.java +++ b/jpa-one-to-many-demo/src/test/java/com/amit/jpa/JpaOneToManyDemoApplicationTests.java @@ -1,10 +1,14 @@ -package com.example.jpa; +package com.amit.jpa; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; - +/** +* +* @author Amit Patil +* +**/ @RunWith(SpringRunner.class) @SpringBootTest public class JpaOneToManyDemoApplicationTests { diff --git a/jpa-one-to-one-demo/Hibernate one to one mapping examle.postman_collection.json b/jpa-one-to-one-demo/Hibernate one to one mapping examle.postman_collection.json new file mode 100644 index 0000000..b91605d --- /dev/null +++ b/jpa-one-to-one-demo/Hibernate one to one mapping examle.postman_collection.json @@ -0,0 +1,234 @@ +{ + "id": "4df5465b-c7ea-7975-1123-2b3f2ed0f5c7", + "name": "Hibernate one to one mapping examle", + "description": "", + "order": [ + "b170f4ea-e3f0-fbaa-51fa-9a1e9777118d", + "24b1fa01-f92d-c4e1-c915-85be4819146b", + "d8cbed58-b687-7ee4-08f0-b33a4233b6b1", + "76f5bc70-ab5e-512d-a4ad-de16007ebb6e", + "e0f51fb0-33ae-b787-7208-220ab953b0f0", + "17a7b55e-f15e-635e-5a90-b948b263e248", + "c246e38e-fa61-e509-2e60-9524566127b4" + ], + "folders": [], + "folders_order": [], + "timestamp": 1569653627690, + "owner": "2037757", + "public": false, + "requests": [ + { + "id": "17a7b55e-f15e-635e-5a90-b948b263e248", + "headers": "Content-Type: application/json\n", + "headerData": [ + { + "key": "Content-Type", + "value": "application/json", + "description": "", + "enabled": true + } + ], + "url": "localhost:8080/v1/userProfile/1", + "queryParams": [], + "pathVariables": {}, + "pathVariableData": [], + "preRequestScript": null, + "method": "GET", + "collectionId": "4df5465b-c7ea-7975-1123-2b3f2ed0f5c7", + "data": null, + "dataMode": "params", + "name": "Retrieve single userProfile details", + "description": "", + "descriptionFormat": "html", + "time": 1569658918810, + "version": 2, + "responses": [], + "tests": null, + "currentHelper": "normal", + "helperAttributes": {} + }, + { + "id": "24b1fa01-f92d-c4e1-c915-85be4819146b", + "headers": "Content-Type: application/json\n", + "headerData": [ + { + "key": "Content-Type", + "value": "application/json", + "description": "", + "enabled": true + } + ], + "url": "localhost:8080/v1/users", + "queryParams": [], + "pathVariables": {}, + "pathVariableData": [], + "preRequestScript": null, + "method": "GET", + "collectionId": "4df5465b-c7ea-7975-1123-2b3f2ed0f5c7", + "data": null, + "dataMode": "params", + "name": "Retrieve all user details", + "description": "", + "descriptionFormat": "html", + "time": 1569653756579, + "version": 2, + "responses": [], + "tests": null, + "currentHelper": "normal", + "helperAttributes": {} + }, + { + "id": "76f5bc70-ab5e-512d-a4ad-de16007ebb6e", + "headers": "Content-Type: application/json\n", + "headerData": [ + { + "key": "Content-Type", + "value": "application/json", + "description": "", + "enabled": true + } + ], + "url": "localhost:8080/v1/userProfile", + "queryParams": [], + "pathVariables": {}, + "pathVariableData": [], + "preRequestScript": null, + "method": "POST", + "collectionId": "4df5465b-c7ea-7975-1123-2b3f2ed0f5c7", + "data": [], + "dataMode": "raw", + "name": "save new userProfile without actual user association", + "description": "user set to null reference", + "descriptionFormat": "html", + "time": 1569658739461, + "version": 2, + "responses": [], + "tests": null, + "currentHelper": "normal", + "helperAttributes": {}, + "rawModeData": "{\n\t\t\"phoneNumber\": \"+91-7829190061\",\n\t\t\"gender\": \"MALE\",\n\t\t\"dateOfBirth\": \"2019-09-28\",\n\t\t\"address1\": \"address1 without user association\",\n\t\t\"address2\": \"some dummy adress2 \",\n\t\t\"street\": \"some dummy street\",\n\t\t\"city\": \"Bangalore\",\n\t\t\"state\": \"Karnataka\",\n\t\t\"country\": \"India\",\n\t\t\"zipCode\": \"560100\",\n\t\t\"user\": null\n}" + }, + { + "id": "b170f4ea-e3f0-fbaa-51fa-9a1e9777118d", + "headers": "Content-Type: application/json\n", + "headerData": [ + { + "key": "Content-Type", + "value": "application/json", + "description": "", + "enabled": true + } + ], + "url": "localhost:8080/v1/user", + "queryParams": [], + "pathVariables": {}, + "pathVariableData": [], + "preRequestScript": null, + "method": "POST", + "collectionId": "4df5465b-c7ea-7975-1123-2b3f2ed0f5c7", + "data": [], + "dataMode": "raw", + "name": "Create user details", + "description": "", + "descriptionFormat": "html", + "time": 1569653662501, + "version": 2, + "responses": [], + "tests": null, + "currentHelper": "normal", + "helperAttributes": {}, + "rawModeData": "{\n\t\"id\": \"\",\n\t\"firstName\": \"Ranjit\",\n\t\"lastName\": \"Patil\",\n\t\"email\": \"Ranjit@gmail.com\",\n\t\"password\": \"pass123\",\n\t\"userProfile\": {\n\t\t\"id\": \"\",\n\t\t\"phoneNumber\": \"+91-7829190061\",\n\t\t\"gender\": \"MALE\",\n\t\t\"dateOfBirth\": \"2019-09-28\",\n\t\t\"address1\": \"some dummy address1 about my residence\",\n\t\t\"address2\": \"some dummy adress2 \",\n\t\t\"street\": \"some dummy street\",\n\t\t\"city\": \"Bangalore\",\n\t\t\"state\": \"Karnataka\",\n\t\t\"country\": \"India\",\n\t\t\"zipCode\": \"560100\"\n\t}\n}" + }, + { + "id": "c246e38e-fa61-e509-2e60-9524566127b4", + "headers": "Content-Type: application/json\n", + "headerData": [ + { + "key": "Content-Type", + "value": "application/json", + "description": "", + "enabled": true + } + ], + "url": "localhost:8080/v1/userProfiles", + "queryParams": [], + "pathVariables": {}, + "pathVariableData": [], + "preRequestScript": null, + "method": "GET", + "collectionId": "4df5465b-c7ea-7975-1123-2b3f2ed0f5c7", + "data": null, + "dataMode": "params", + "name": "Retrieve All the userProfiles details", + "description": "", + "descriptionFormat": "html", + "time": 1569658935643, + "version": 2, + "responses": [], + "tests": null, + "currentHelper": "normal", + "helperAttributes": {} + }, + { + "id": "d8cbed58-b687-7ee4-08f0-b33a4233b6b1", + "headers": "Content-Type: application/json\n", + "headerData": [ + { + "key": "Content-Type", + "value": "application/json", + "description": "", + "enabled": true + } + ], + "url": "localhost:8080/v1/user/1", + "queryParams": [], + "pathVariables": {}, + "pathVariableData": [], + "preRequestScript": null, + "method": "GET", + "collectionId": "4df5465b-c7ea-7975-1123-2b3f2ed0f5c7", + "data": null, + "dataMode": "params", + "name": "Retrieve single user details", + "description": "", + "descriptionFormat": "html", + "time": 1569655016616, + "version": 2, + "responses": [], + "tests": null, + "currentHelper": "normal", + "helperAttributes": {} + }, + { + "id": "e0f51fb0-33ae-b787-7208-220ab953b0f0", + "headers": "Content-Type: application/json\n", + "headerData": [ + { + "key": "Content-Type", + "value": "application/json", + "description": "", + "enabled": true + } + ], + "url": "localhost:8080/v1/userProfile", + "queryParams": [], + "pathVariables": {}, + "pathVariableData": [], + "preRequestScript": null, + "method": "POST", + "collectionId": "4df5465b-c7ea-7975-1123-2b3f2ed0f5c7", + "data": [], + "dataMode": "raw", + "name": "save new userProfile with invalid user association", + "description": "user details set to empty object", + "descriptionFormat": "html", + "time": 1569658813570, + "version": 2, + "responses": [], + "tests": null, + "currentHelper": "normal", + "helperAttributes": {}, + "rawModeData": "{\n\t\t\"phoneNumber\": \"+91-7829190061\",\n\t\t\"gender\": \"MALE\",\n\t\t\"dateOfBirth\": \"2019-09-28\",\n\t\t\"address1\": \"address1 without user association\",\n\t\t\"address2\": \"some dummy adress2 \",\n\t\t\"street\": \"some dummy street\",\n\t\t\"city\": \"Bangalore\",\n\t\t\"state\": \"Karnataka\",\n\t\t\"country\": \"India\",\n\t\t\"zipCode\": \"560100\",\n\t\t\"user\": {}\n}" + } + ] +} \ No newline at end of file diff --git a/jpa-one-to-one-demo/pom.xml b/jpa-one-to-one-demo/pom.xml index 212d569..d9f5874 100644 --- a/jpa-one-to-one-demo/pom.xml +++ b/jpa-one-to-one-demo/pom.xml @@ -1,5 +1,6 @@ - 4.0.0 @@ -15,7 +16,7 @@ org.springframework.boot spring-boot-starter-parent 2.0.0.RELEASE - + @@ -38,7 +39,15 @@ mysql mysql-connector-java runtime + 8.0.13 + + + org.hibernate + hibernate-core + 5.3.1.Final + + org.springframework.boot spring-boot-starter-test diff --git a/jpa-one-to-one-demo/src/main/java/com/amit/jpa/JpaOneToOneDemoApplication.java b/jpa-one-to-one-demo/src/main/java/com/amit/jpa/JpaOneToOneDemoApplication.java new file mode 100644 index 0000000..b780725 --- /dev/null +++ b/jpa-one-to-one-demo/src/main/java/com/amit/jpa/JpaOneToOneDemoApplication.java @@ -0,0 +1,16 @@ +package com.amit.jpa; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +/** +* +* @author Amit Patil +* +**/ +@SpringBootApplication +public class JpaOneToOneDemoApplication { + + public static void main(String[] args) { + SpringApplication.run(JpaOneToOneDemoApplication.class, args); + } +} diff --git a/jpa-one-to-one-demo/src/main/java/com/amit/jpa/app/configuration/AppConfiguration.java b/jpa-one-to-one-demo/src/main/java/com/amit/jpa/app/configuration/AppConfiguration.java new file mode 100644 index 0000000..6479094 --- /dev/null +++ b/jpa-one-to-one-demo/src/main/java/com/amit/jpa/app/configuration/AppConfiguration.java @@ -0,0 +1,20 @@ +package com.amit.jpa.app.configuration; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import com.amit.jpa.service.AppService; + +/** +* +* @author Amit Patil +* +**/ +@Configuration +public class AppConfiguration { + + @Bean + public AppService appService() { + return new AppService(); + } +} diff --git a/jpa-one-to-one-demo/src/main/java/com/amit/jpa/app/controllers/AppController.java b/jpa-one-to-one-demo/src/main/java/com/amit/jpa/app/controllers/AppController.java new file mode 100644 index 0000000..297fbb9 --- /dev/null +++ b/jpa-one-to-one-demo/src/main/java/com/amit/jpa/app/controllers/AppController.java @@ -0,0 +1,58 @@ +package com.amit.jpa.app.controllers; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import com.amit.jpa.model.User; +import com.amit.jpa.model.UserProfile; +import com.amit.jpa.service.AppService; + +/** +* +* @author Amit Patil +* +**/ +@RestController +@RequestMapping("/v1") +public class AppController { + + @Autowired + private AppService appService; + + @RequestMapping(value = "/user", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + public User saveUserDetails(@RequestBody User user) { + return appService.saveUserDetails(user); + } + + @RequestMapping(value = "/user/{userId}", method = RequestMethod.GET, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + public User getUserDetailsById(@PathVariable("userId") Long id) { + return appService.getUserDetailsById(id); + } + + @RequestMapping(value = "/users", method = RequestMethod.GET, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + public List getAllUserDetails() { + return appService.getAllUserDetails(); + } + + @RequestMapping(value = "/userProfile", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + public UserProfile saveUserProfileDetails(@RequestBody UserProfile userProfile) { + return appService.saveUserProfile(userProfile); + } + + @RequestMapping(value = "/userProfile/{userProfileId}", method = RequestMethod.GET, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + public UserProfile getUserProfileDetails(@PathVariable("userProfileId") Long id) { + return appService.getUserProfileDetails(id); + } + + @RequestMapping(value = "/userProfiles", method = RequestMethod.GET, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + public List getAllUserProfiles() { + return appService.getAllUserProfileDetails(); + } +} diff --git a/jpa-one-to-one-demo/src/main/java/com/amit/jpa/model/Gender.java b/jpa-one-to-one-demo/src/main/java/com/amit/jpa/model/Gender.java new file mode 100644 index 0000000..aa847b9 --- /dev/null +++ b/jpa-one-to-one-demo/src/main/java/com/amit/jpa/model/Gender.java @@ -0,0 +1,11 @@ +package com.amit.jpa.model; + +/** +* +* @author Amit Patil +* +**/ +public enum Gender { + MALE, + FEMALE +} diff --git a/jpa-one-to-one-demo/src/main/java/com/example/jpa/model/User.java b/jpa-one-to-one-demo/src/main/java/com/amit/jpa/model/User.java similarity index 87% rename from jpa-one-to-one-demo/src/main/java/com/example/jpa/model/User.java rename to jpa-one-to-one-demo/src/main/java/com/amit/jpa/model/User.java index f41fc36..2a67681 100644 --- a/jpa-one-to-one-demo/src/main/java/com/example/jpa/model/User.java +++ b/jpa-one-to-one-demo/src/main/java/com/amit/jpa/model/User.java @@ -1,18 +1,28 @@ -package com.example.jpa.model; +package com.amit.jpa.model; import javax.persistence.*; import javax.validation.constraints.Email; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; + +import com.fasterxml.jackson.annotation.JsonManagedReference; + import java.io.Serializable; /** - * Created by rajeevkumarsingh on 20/11/17. - */ +* +* @author Amit Patil +* +**/ @Entity @Table(name = "users") public class User implements Serializable { - @Id + /** + * + */ + private static final long serialVersionUID = 7529424835544174898L; + + @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @@ -35,9 +45,10 @@ public class User implements Serializable { @Size(max = 128) private String password; + @JsonManagedReference @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, - mappedBy = "user") + mappedBy = "user", orphanRemoval = true) private UserProfile userProfile; // Hibernate requires a no-arg constructor diff --git a/jpa-one-to-one-demo/src/main/java/com/example/jpa/model/UserProfile.java b/jpa-one-to-one-demo/src/main/java/com/amit/jpa/model/UserProfile.java similarity index 93% rename from jpa-one-to-one-demo/src/main/java/com/example/jpa/model/UserProfile.java rename to jpa-one-to-one-demo/src/main/java/com/amit/jpa/model/UserProfile.java index 099a759..3d45560 100644 --- a/jpa-one-to-one-demo/src/main/java/com/example/jpa/model/UserProfile.java +++ b/jpa-one-to-one-demo/src/main/java/com/amit/jpa/model/UserProfile.java @@ -1,17 +1,27 @@ -package com.example.jpa.model; +package com.amit.jpa.model; import javax.persistence.*; import javax.validation.constraints.Size; + +import com.fasterxml.jackson.annotation.JsonBackReference; + import java.io.Serializable; import java.util.Date; /** - * Created by rajeevkumarsingh on 20/11/17. - */ +* +* @author Amit Patil +* +**/ @Entity @Table(name = "user_profiles") public class UserProfile implements Serializable { - @Id + /** + * + */ + private static final long serialVersionUID = 3960703238763006209L; + + @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @@ -49,6 +59,7 @@ public class UserProfile implements Serializable { @Size(max = 32) private String zipCode; + @JsonBackReference @OneToOne(fetch = FetchType.LAZY, optional = false) @JoinColumn(name = "user_id", nullable = false) private User user; diff --git a/jpa-one-to-one-demo/src/main/java/com/example/jpa/repository/UserProfileRepository.java b/jpa-one-to-one-demo/src/main/java/com/amit/jpa/repository/UserProfileRepository.java similarity index 63% rename from jpa-one-to-one-demo/src/main/java/com/example/jpa/repository/UserProfileRepository.java rename to jpa-one-to-one-demo/src/main/java/com/amit/jpa/repository/UserProfileRepository.java index 1051f8a..3df4b57 100644 --- a/jpa-one-to-one-demo/src/main/java/com/example/jpa/repository/UserProfileRepository.java +++ b/jpa-one-to-one-demo/src/main/java/com/amit/jpa/repository/UserProfileRepository.java @@ -1,12 +1,15 @@ -package com.example.jpa.repository; +package com.amit.jpa.repository; -import com.example.jpa.model.UserProfile; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; +import com.amit.jpa.model.UserProfile; + /** - * Created by rajeevkumarsingh on 20/11/17. - */ +* +* @author Amit Patil +* +**/ @Repository public interface UserProfileRepository extends JpaRepository { diff --git a/jpa-one-to-one-demo/src/main/java/com/example/jpa/repository/UserRepository.java b/jpa-one-to-one-demo/src/main/java/com/amit/jpa/repository/UserRepository.java similarity index 62% rename from jpa-one-to-one-demo/src/main/java/com/example/jpa/repository/UserRepository.java rename to jpa-one-to-one-demo/src/main/java/com/amit/jpa/repository/UserRepository.java index fba1c91..fe22066 100644 --- a/jpa-one-to-one-demo/src/main/java/com/example/jpa/repository/UserRepository.java +++ b/jpa-one-to-one-demo/src/main/java/com/amit/jpa/repository/UserRepository.java @@ -1,12 +1,15 @@ -package com.example.jpa.repository; +package com.amit.jpa.repository; -import com.example.jpa.model.User; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; +import com.amit.jpa.model.User; + /** - * Created by rajeevkumarsingh on 20/11/17. - */ +* +* @author Amit Patil +* +**/ @Repository public interface UserRepository extends JpaRepository { diff --git a/jpa-one-to-one-demo/src/main/java/com/amit/jpa/service/AppService.java b/jpa-one-to-one-demo/src/main/java/com/amit/jpa/service/AppService.java new file mode 100644 index 0000000..a302f37 --- /dev/null +++ b/jpa-one-to-one-demo/src/main/java/com/amit/jpa/service/AppService.java @@ -0,0 +1,49 @@ +package com.amit.jpa.service; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; + +import com.amit.jpa.model.User; +import com.amit.jpa.model.UserProfile; +import com.amit.jpa.repository.UserProfileRepository; +import com.amit.jpa.repository.UserRepository; + +/** +* +* @author Amit Patil +* +**/ +public class AppService { + + @Autowired + private UserRepository userRepository; + + @Autowired + private UserProfileRepository userProfileRepository; + + public User saveUserDetails(User user) { + return userRepository.save(user); + } + + public User getUserDetailsById(Long id) { + return userRepository.findById(id).get(); + } + + public List getAllUserDetails() { + return userRepository.findAll(); + } + + public UserProfile saveUserProfile(UserProfile userProfile) { + return userProfileRepository.save(userProfile); + } + + public UserProfile getUserProfileDetails(Long id) { + return userProfileRepository.findById(id).get(); + } + + public List getAllUserProfileDetails() { + return userProfileRepository.findAll(); + } +} + \ No newline at end of file diff --git a/jpa-one-to-one-demo/src/main/java/com/example/jpa/JpaOneToOneDemoApplication.java b/jpa-one-to-one-demo/src/main/java/com/example/jpa/JpaOneToOneDemoApplication.java deleted file mode 100644 index 72de4c6..0000000 --- a/jpa-one-to-one-demo/src/main/java/com/example/jpa/JpaOneToOneDemoApplication.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.example.jpa; - -import com.example.jpa.model.Gender; -import com.example.jpa.model.User; -import com.example.jpa.model.UserProfile; -import com.example.jpa.repository.UserRepository; -import com.example.jpa.repository.UserProfileRepository; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.CommandLineRunner; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import java.util.Calendar; - -@SpringBootApplication -public class JpaOneToOneDemoApplication implements CommandLineRunner { - - @Autowired - private UserRepository userRepository; - - @Autowired - private UserProfileRepository userProfileRepository; - - public static void main(String[] args) { - SpringApplication.run(JpaOneToOneDemoApplication.class, args); - } - - @Override - public void run(String... args) throws Exception { - // Clean up database tables - userProfileRepository.deleteAllInBatch(); - userRepository.deleteAllInBatch(); - - //========================================= - - // Create a User instance - User user = new User("Rajeev", "Singh", "rajeev@callicoder.com", - "MY_SUPER_SECRET_PASSWORD"); - - Calendar dateOfBirth = Calendar.getInstance(); - dateOfBirth.set(1992, 7, 21); - - // Create a UserProfile instance - UserProfile userProfile = new UserProfile("+91-8197882053", Gender.MALE, dateOfBirth.getTime(), - "747", "2nd Cross", "Golf View Road, Kodihalli", "Bangalore", - "Karnataka", "India", "560008"); - - - // Set child reference(userProfile) in parent entity(user) - user.setUserProfile(userProfile); - - // Set parent reference(user) in child entity(userProfile) - userProfile.setUser(user); - - // Save Parent Reference (which will save the child as well) - userRepository.save(user); - - //========================================= - } - - -} diff --git a/jpa-one-to-one-demo/src/main/java/com/example/jpa/model/Gender.java b/jpa-one-to-one-demo/src/main/java/com/example/jpa/model/Gender.java deleted file mode 100644 index e77317f..0000000 --- a/jpa-one-to-one-demo/src/main/java/com/example/jpa/model/Gender.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.example.jpa.model; - -/** - * Created by rajeevkumarsingh on 29/11/17. - */ -public enum Gender { - MALE, - FEMALE -} diff --git a/jpa-one-to-one-demo/src/main/resources/application.properties b/jpa-one-to-one-demo/src/main/resources/application.properties index 549e2fb..93e3d28 100644 --- a/jpa-one-to-one-demo/src/main/resources/application.properties +++ b/jpa-one-to-one-demo/src/main/resources/application.properties @@ -1,15 +1,15 @@ # DATASOURCE (DataSourceAutoConfiguration & DataSourceProperties) spring.datasource.url=jdbc:mysql://localhost:3306/jpa_one_to_one_demo?useSSL=false spring.datasource.username=root -spring.datasource.password=callicoder - +spring.datasource.password=root +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver # Hibernate # The SQL dialect makes Hibernate generate better SQL for the chosen database -spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5InnoDBDialect +spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL8Dialect # Hibernate ddl auto (create, create-drop, validate, update) spring.jpa.hibernate.ddl-auto = update -logging.level.org.hibernate.SQL=DEBUG -logging.level.org.hibernate.type=TRACE \ No newline at end of file +#logging.level.org.hibernate.SQL=DEBUG +#logging.level.org.hibernate.type=TRACE \ No newline at end of file