백엔드/JPA

[JPA] Entity 어노테이션

tero1115 2023. 7. 21. 17:26
// 엔티티임을 명시
@Entity
 
// 데이터베이스의 테이블이름과 연동
@Table(name = "regions")
 
// 엔티티에서 setter는 꼭 필요할 때만 직접 만드는 것을 추천
// toString도 직접 만드는 것을 추천
public class RegionsEntity {
 
    // 기본키 (PK)에 @Id를 붙인다
    @Id
 
    // 값 자동증가
    @GeneratedValue(strategy = GenerationType.IDENTITY)
 
    // 데이터베이스에 있는 컬럼명을 연결
    // 컬럼의 속성을 맞춰주는 것이 좋다
    @Column(name = "region_id", nullable = false, unique = true)
 
    private Integer regionId;

}

 

 

  1. @Entity: 해당 클래스가 JPA 엔티티임을 선언하는 어노테이션입니다. 데이터베이스의 테이블과 매핑됩니다.
  2. @Table: 엔티티 클래스가 매핑되는 데이터베이스 테이블을 지정할 때 사용하는 어노테이션입니다. 테이블 이름, 스키마, 인덱스 등을 설정할 수 있습니다.
  3. @Id: 엔티티의 기본 키(primary key) 필드를 지정할 때 사용하는 어노테이션입니다.
  4. @GeneratedValue: 기본 키 필드의 값을 자동으로 생성할 때 사용하는 어노테이션입니다. 보통 자동 증가하는 기능을 구현하는 데 사용됩니다.
  5. @Column: 엔티티 클래스의 속성을 데이터베이스의 컬럼과 매핑할 때 사용하는 어노테이션입니다. 컬럼의 이름, 길이, NULL 허용 여부 등을 설정할 수 있습니다.
  6. @OneToMany: 일대다(1:N) 관계를 표현할 때 사용하는 어노테이션입니다. 한 엔티티는 여러 개의 관련 엔티티를 가질 수 있습니다.
  7. @ManyToOne: 다대일(N:1) 관계를 표현할 때 사용하는 어노테이션입니다. 여러 엔티티가 한 개의 관련 엔티티를 가질 수 있습니다.
  8. @OneToOne: 일대일(1:1) 관계를 표현할 때 사용하는 어노테이션입니다. 두 엔티티가 각각 하나의 관련 엔티티를 가집니다.
  9. @ManyToMany: 다대다(N:N) 관계를 표현할 때 사용하는 어노테이션입니다. 두 엔티티가 서로 여러 개의 관련 엔티티를 가질 수 있습니다.

 


@OneToMany(mappedBy = "tempEntity", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
@Where(clause = "delete_date IS NULL")
private List<TempSubEntity> tempSubEntityList;

 

mappedBy = "tempEntity"

연관된 엔터티(TempSubEntity)에서 어떤 속성이 이 관계를 관리하는지를 지정합니다. TempSubEntity 클래스에서 tempEntity라는 속성을 사용하여 TempEntity와 연관시킵니다.

 

fetch = FetchType.LAZY

데이터를 검색할 때 TempSubEntity 엔터티를 지연 로딩하여 가져오라는 것을 의미합니다. 이것은 TempEntity를 검색할 때 연관된 TempSubEntity 객체가 필요한 경우에만 가져오라는 의미입니다. 성능을 최적화하는 데 도움이 됩니다.

 

cascade = CascadeType.ALL

TempEntity에서 수행된 변경 작업(예: 저장, 업데이트, 삭제)을 연관된 TempSubEntity에도 전파하라는 것을 의미합니다. CascadeType.ALL은 모든 변경 유형에 대해 적용됩니다.

 

orphanRemoval = true

이 옵션을 true로 설정하면, TempSubEntity 객체가 TempEntity의 tempSubEntityList에서 제거되면 해당 TempSubEntity 객체가 영속성 컨텍스트에서 삭제됩니다.

다시 말해, TempEntity와 연관된 TempSubEntity가 tempSubEntityList에서 삭제되면 DB에서도 삭제됩니다.

 

@Where(clause = "delete_date IS NULL")

Hibernate에서 사용하는 추가적인 기능으로, delete_date 열이 NULL인 경우에만 관련된 TempSubEntity 엔터티를 가져온다는 것을 의미합니다. 이것은 일반적으로 논리 삭제(soft delete)를 구현할 때 사용됩니다.

delete_date가 NULL이 아닌 경우, 해당 엔터티는 더 이상 유효하지 않음을 나타냅니다.

 


@Getter
@Builder
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode(of = "idx", callSuper = false)
@Entity
@Table(name = "VACATION")
@DynamicInsert
@DynamicUpdate
public class VacationEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "idx", updatable = false)
    private Long idx;

    @Column(name = "create_date", updatable = false, nullable = false)
    private LocalDateTime createDate;

    @Column(name = "update_date")
    private LocalDateTime updateDate;

    @Column(name = "delete_date")
    private LocalDateTime deleteDate;

    @OneToOne(mappedBy = "vacationEntity", cascade = CascadeType.ALL)
    private VacationDayEntity vacationDayEntity;

    @OneToOne(mappedBy = "vacationEntity", cascade = CascadeType.ALL)
    private VacationReasonEntity vacationReasonEntity;

    @OneToOne
    @JoinColumn(name = "user_idx")
    private UserEntity user;
}

    @OneToOne(mappedBy = "vacationEntity", cascade = CascadeType.ALL)
    private VacationDayEntity vacationDayEntity;

@Getter
@Builder
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode(of = "idx", callSuper = false)
@Entity
@Table(name = "VACATION_DAY") // TODO 언더바 붙여도 되는지?
@DynamicInsert
@DynamicUpdate
public class VacationDayEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "idx", updatable = false)
    private Long idx;

    @Column(name = "day", nullable = false)
    private String day;

    @Column(name = "create_date", updatable = false, nullable = false)
    private LocalDateTime createDate;

    @Column(name = "update_date")
    private LocalDateTime updateDate;

    @Column(name = "delete_date")
    private LocalDateTime deleteDate;

    @OneToOne
    @JoinColumn(name = "vacation_id")
    private VacationEntity vacationEntity;

}

    @OneToOne
    @JoinColumn(name = "vacation_id")
    private VacationEntity vacationEntity;

'백엔드 > JPA' 카테고리의 다른 글

[JPA] 중간테이블  (0) 2024.05.31
[JPA] JPA Repository 메소드 명명규칙  (0) 2023.07.27