Toy Project-エンティティv 1の作成(ウイルス対策Webアプリケーションの作成3)
71837 ワード
Githubソース
BaseEntity
まず、BaseEntityを作成して、すべてのエンティティの作成時間を共同で管理します.
その後の修正時間などが必要な場合は、これらの時間を追加します.
すべてのエンティティの基本作成者は、
すべてのエンティティ、DTO、およびリクエスト・オブジェクトは、
△双方向関係において副作用を生じないように、データを設定しない便利な方法を定義しました.
すべての
JPAでは
BaseEntity
まず、BaseEntityを作成して、すべてのエンティティの作成時間を共同で管理します.
その後の修正時間などが必要な場合は、これらの時間を追加します.
@Getter
@EntityListeners(AuditingEntityListener.class)
@MappedSuperclass
public class BaseEntity {
@CreatedDate
@Column(updatable = false)
protected LocalDateTime createAt;
}
UserEntityすべてのエンティティの基本作成者は、
access level
がPROTECTED
であることを阻止し、それを開くことを決定した.Getter
のみで認証されるため、一般ユーザーはパスワードを必要としませんが、フォームを使用してログインするため、Oauth2
を追加しました.ADMIN
から提供された情報を引き続き提供し、フォームを通じて他の受信できない情報を受信します.すべてのエンティティ、DTO、およびリクエスト・オブジェクトは、
Oauth2
モードを使用します.Builder
モードは、エラーを回避し、インスタンスの作成をより明確にすることができると考え、このプロジェクトに適用してみます.package com.threefam.reserve.domain.entity;
import com.threefam.reserve.domain.value.Gender;
import com.threefam.reserve.domain.value.Role;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import javax.persistence.*;
import java.time.LocalDateTime;
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity
@Table(name = "user")
@Getter
public class User extends BaseEntity{
@Column(name = "user_id")
@Id @GeneratedValue
private Long id;
@Column(nullable = false)
private String email;
@Column(nullable = false)
private String password;
@Column(nullable = false)
private String name;
@Column(nullable = false)
@Enumerated(EnumType.STRING)
private Gender gender;
@Column(nullable = false)
private Integer age;
@Column(nullable = false)
private String address;
@Column(nullable = false)
private String detailAddress;
@Enumerated(EnumType.STRING)
@Column(nullable = false)
private Role role;
@Builder(builderMethodName = "createUser")
public User(String email, String password, String name,
Gender gender, Integer age, String address, String detailAddress, Role role) {
this.email = email;
this.password = password;
this.name=name;
this.gender = gender;
this.age = age;
this.address = address;
this.detailAddress = detailAddress;
this.role = role;
this.createAt = LocalDateTime.now();
}
}
HopitalEntityBuilder
オブジェクトは、オブジェクトグラフィックで保存可能な日付を双方向に表示するように設定されています.△双方向関係において副作用を生じないように、データを設定しない便利な方法を定義しました.
すべての
HospitalEntity
関係はToOne
に設定されています.( Lazy
No! )JPAでは
Eager
タイプBoolean
を使用@Type
オブジェクトでのクエリーを容易にするために、双方向リバースエンティティも設定されています.HospitalEntity
およびcascade
を使用して、病院エンティティおよびワクチンエンティティのライフサイクルを同期させる@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity
@Table(name = "hospital")
@Getter
public class Hospital extends BaseEntity{
@Id @GeneratedValue
@Column(name = "hospital_id")
private Long id;
@Column(name = "hospital_name")
private String hospitalName;
// 양방향
@OneToMany(mappedBy = "hospital",cascade = CascadeType.ALL)
@JsonIgnoreProperties({"hospital"})
private List<AvailableDate> availableDates = new ArrayList<>();
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "admin_id")
private Admin admin;
public void setAdmin(Admin admin) {
this.admin = admin;
admin.getHospitals().add(this);
}
@Column(nullable = false)
private String address;
@Column(nullable = false)
private String detailAddress;
@Column(name = "total_quantity")
private Integer totalQuantity;
public void cancel() {
this.totalQuantity++;
}
@Column(name = "date_accept")
private Integer dateAccept;
@Column(name = "time_accept")
private Integer timeAccept;
public void setTotalVaccineQuantity(Integer qty) {
this.totalQuantity = qty;
}
public void removeStock() {
int restStock=this.totalQuantity-1;
if(restStock==0){
setEnabled(false);
}
if(restStock<0){
throw new NotEnoughStockException("예약 가능한 수량이 부족합니다.");
}
this.totalQuantity=restStock;
}
public void updateDateAccept(Integer dateAccept){this.dateAccept=dateAccept;}
public void updateTimeAccept(Integer timeAccept){this.timeAccept=timeAccept;}
// true: y, false: n
@Type(type = "yes_no")
private Boolean enabled = true; // 예약 가능 여부
@OneToMany(mappedBy = "hospital", cascade = CascadeType.PERSIST, orphanRemoval = true)
@JsonIgnoreProperties({"hospital"})
private List<Vaccine> vaccines = new ArrayList<>();
public void setEnabled(boolean flag) {
this.enabled = flag;
}
// 연관관계 편의 메서드
private void addAdmin(Admin admin) {
this.admin = admin;
admin.getHospitals().add(this);
}
@Builder(builderMethodName = "createHospital")
public Hospital(String hospitalName, String address, String detailAddress,Integer dateAccept,Integer timeAccept) {
this.hospitalName = hospitalName;
this.address = address;
this.detailAddress = detailAddress;
this.createAt = LocalDateTime.now();
this.dateAccept=dateAccept;
this.timeAccept=timeAccept;
}
}
VaccineEntity@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity
@Table(name = "vaccine")
@Getter
public class Vaccine extends BaseEntity{
@Id @GeneratedValue
@Column(name = "vaccine_id")
private Long id;
@Column(name = "vaccine_name", nullable = false)
private String vaccineName;
@Column(nullable = false)
private Integer quantity;
public void cancel() {
this.quantity++;
this.enabled=true;
}
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "hospital_id")
private Hospital hospital;
@Type(type="yes_no")
private boolean enabled = true;
public void setEnabled(boolean flag) {
this.enabled = flag;
}
@Builder(builderMethodName = "createVaccine")
public Vaccine(String vaccineName, Integer quantity) {
this.vaccineName = vaccineName;
this.quantity = quantity;
this.createAt = LocalDateTime.now();
}
// 연관관계 편의 메서드
public void addHospital(Hospital hospital) {
this.hospital = hospital;
hospital.getVaccines().add(this);
}
//==비즈니스 로직==//
//예약 취소 시, 사용
public void addStock(){
this.quantity+=1;
}
//예약 시, 사용
public void removeStock(){
int restStock=this.quantity-1;
if(restStock==0){
setEnabled(false);
}
if(restStock<0){
throw new NotEnoughStockException("예약 가능한 수량이 부족합니다.");
}
this.quantity=restStock;
}
//병원 수정 시, 사용
public void updateVaccineQty(Integer quantity){
this.quantity=quantity;
}
}
使用可能な日付エンティティ(保持可能な日付)@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity
@Table(name = "available_date")
@Getter
public class AvailableDate {
@Id
@GeneratedValue
@Column(name = "available_data_id")
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "hospital_id")
private Hospital hospital;
@Column(nullable = false)
private String date;
// 양방향
@OneToMany(mappedBy = "availableDate", cascade = CascadeType.ALL, orphanRemoval = true)
@JsonIgnoreProperties({"availableDate"})
private List<AvailableTime> availableTimes = new ArrayList<>();
// 일일 수용 가능 인원
@Column(name = "accept_count")
private Integer acceptCount;
public void cancel() {
this.acceptCount++;
this.enabled=true;
}
public void decreaseCount() {
int restStock=this.acceptCount-1;
if(restStock==0){
setEnabled(false);
}
if(restStock<0){
throw new NotEnoughStockException("예약 가능한 수량이 부족합니다.");
}
this.acceptCount=restStock;
}
@Type(type = "yes_no")
private Boolean enabled = true;
public void setEnabled(boolean flag) {
this.enabled = flag;
}
// 양방향 연관관계 편의 메서드
public void addHospital(Hospital hospital) {
this.hospital = hospital;
hospital.getAvailableDates().add(this);
}
@Builder(builderMethodName = "createAvailableDate")
public AvailableDate(String date,Integer acceptCount){
this.date=date;
this.acceptCount=acceptCount;
}
//병원 상세내용 수정 시, count update
public void updateAcceptCount(Integer acceptCount){
this.acceptCount=acceptCount;
}
}
AvailableTimeEntity@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity
@Table(name = "available_time")
@Getter
public class AvailableTime {
@Id
@GeneratedValue
@Column(name = "available_time_id")
private Long id;
@Column(nullable = false)
private int time;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "available_date_id")
private AvailableDate availableDate;
// 한 타임동안 수용 가능한 인원
private Integer acceptCount;
public void cancel() {
this.acceptCount++;
this.enabled=true;
this.availableDate.cancel();
}
public void decreaseCount() {
int restStock=this.acceptCount-1;
if(restStock==0){
setEnabled(false);
}
if(restStock<0){
throw new NotEnoughStockException("예약 가능한 수량이 부족합니다.");
}
this.availableDate.decreaseCount();
this.acceptCount=restStock;
}
@Type(type = "yes_no")
private Boolean enabled = true;
public void setEnabled(boolean flag) {
this.enabled = flag;
}
// 양방향 연관관계 편의 메서드
public void addAvailableDate(AvailableDate availableDate) {
this.availableDate = availableDate;
availableDate.getAvailableTimes().add(this);
}
private void setAvailableTime(int time) {
this.time = time;
}
@Builder(builderMethodName = "createAvailableTime")
public AvailableTime(int time, Integer acceptCount) {
this.time = time;
this.acceptCount = acceptCount;
}
public void updateAcceptCount(Integer acceptCount){
this.acceptCount=acceptCount;
}
}
ReserviceItemEntity(予約)@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity
@Table(name = "reserve_item")
@Getter
public class ReserveItem extends BaseEntity {
@Column(name = "reserve_item_id")
@Id
@GeneratedValue
private Long id;
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id")
private User user;
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "hospital_id")
private Hospital Hospital;
@Enumerated(value = EnumType.STRING)
private ReserveStatus status = ReserveStatus.COMP;
@Column(nullable = false)
private String vaccineName;
@Column(nullable = false)
private String reserveDate;
@Column(nullable = false)
private int reserveTime;
@Builder(builderMethodName = "createReserveItem")
public ReserveItem(
User user, Hospital Hospital, ReserveStatus status, String reserveDate, int reserveTime, String vaccineName) {
this.user = user;
this.Hospital = Hospital;
this.status = status;
this.reserveDate = reserveDate;
this.reserveTime = reserveTime;
this.vaccineName = vaccineName;
this.createAt = LocalDateTime.now();
}
//==비즈니스 로직==//
//예약 날짜 및 예약 시간 update
public void updateDateAndTime(String reserveDate,int reserveTime){
this.reserveDate=reserveDate;
this.reserveTime=reserveTime;
}
}
AdminEntityorphanRemoval
でオブジェクト図面を双方向に設定して病院を表示@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity
@Table(name = "admin")
@Getter
public class Admin extends BaseEntity {
@Id @GeneratedValue
private Long id;
private String name;
@OneToMany(mappedBy = "admin", cascade = CascadeType.ALL)
@JsonIgnoreProperties({"admin"})
private List<Hospital> hospitals = new ArrayList<>();
@Builder(builderMethodName = "createAdmin")
public Admin(String name) {
this.name = name;
}
}
Reference
この問題について(Toy Project-エンティティv 1の作成(ウイルス対策Webアプリケーションの作成3)), 我々は、より多くの情報をここで見つけました https://velog.io/@dhk22/Toy-Project-백신-예약-웹-애플리케이션-제작-2-엔티티-작성-v1テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol