Instagramクローンコード2 DBとJPA
16215 ワード
📝 要求
📏 ERD
以上に基づき、ERDはdbdiagram.ioを用いて作成される.
✅ JPA
オブジェクト関係マッピング(ORM)
オブジェクト指向プログラミングの場合、JPAはSQLを作成して実行し、リレーショナル・データベースに一致させます.
JPAはインタフェース実装—Hibernate、Eclipse Linkなどを使用する必要があるが、SpringでJPAを使用する場合は、その実装をそのまま使用するのではなく、Spring Data JPAというモジュールを使用する(JPA<-Hibernate<-Spring Data JPA)
なぜSpring Data JPAを使用してHibernateではないのですか->インプリメンテーションの交換が容易
🔍 適用
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa' // jpa 추가
runtimeOnly 'mysql:mysql-connector-java' // mysql
}
package com.clonecoding.instagrambackend.domain;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import javax.persistence.*;
import javax.validation.constraints.NotBlank;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
@Getter
@EntityListeners(AuditingEntityListener.class)
@Entity
public class Post {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@NotBlank
private String text;
@CreatedDate
private LocalDateTime createdAt;
private Long views = 0L;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id")
private User user;
@OneToMany(mappedBy = "post", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
private List<Image> images;
@OneToMany(mappedBy = "post", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
private List<Comment> comments;
@OneToMany(mappedBy = "post", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
private List<PostLike> likes;
public Post() {}
@Builder
public Post(String text, User user, List<Image> images) {
this.text = text;
this.user = user;
this.images = images;
}
}
DBテーブルのカラムをそれぞれ変数として指定します.@OneToManyと@ManyToOneを使用して関連付けを設定できます.
EntityのCRUDを可能にする.
Entityクラスと一緒に配置する必要があります.
package com.clonecoding.instagrambackend.domain;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import java.util.List;
import java.util.Optional;
public interface PostRepository extends JpaRepository<Post, Long> {
List<Post> findByUser(User user);
@Query("SELECT count(c) from Post p join p.comments c where p.id = ?1")
Long countComments(Long id);
@Query("SELECT count(l) from Post p join p.likes l where p.id = ?1")
Long countLikes(Long id);
}
Jpa RepositoryはDaoのようなDB層アクセス者のインタフェースで生成される.インタフェースのみを作成し、Jpa RepositoryJpaRepositoryが提供しない機能を使用する必要がある場合は、@Queryと書いて必要なクエリーを指定できます.
Reference
この問題について(Instagramクローンコード2 DBとJPA), 我々は、より多くの情報をここで見つけました https://velog.io/@h000/Instagram-Clone-Coding-2-DB와-JPAテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol