SpringBoot

SpringBoot - JPA, 단방향 연관 관계, @ManyToOne (2024.05.13)

hminor 2024. 5. 13. 20:11
  • 요즘 뭔가 따로 작성하기엔 너무 범위가 왔다갔다해서
  • 일기 형식으로 공부했던걸 작성하는 용도로라도 기록하기 위해 작성함.

 

1. OneToMany 속성 중 orphanRemoval = true는?

  • 부모 엔터티가 자식 엔터티를 제거할 때 자식 엔터티가 정구적으로 삭제되도록 하기.
  • orphans => 고아
  • 즉. 부모-자식 관계에서 고아로 생각할 수 있는 자식 엔터티가 부모와의 관계가 끊긴 후 
  • DB에 남아있게 하지 않으려면 true, 아니면 false나 설정안하면 됨(default). 

2. @Lob

  • 엔터티 클래스의 속성이 DB에 매핑될 때 사용.
  • Large Object를 나타내며, 매우 큰 데이터나 바이너리 데이터를 나타내는 속성에 적용.

3. Entity명

  • 클래스명을 DetailStockEntity라고 했다면 
  • DB의 테이블명은 자동으로 스네이크 케이스로 변경되어서 "detail_stock_entity"라는 이름의 테이블에 매핑.
  • 다르게 적용하고 싶다면 @Table(name="detail_stock") 이렇게 적용하면 됨.

4. 부모-자식 연관 관계

  • 보통 JPA에서는 양방향 연관 관계보단 단방향 연관 관계를 선호.
  • 불필요한 복잡성을 초래할 수도 있고, 실수로 인해 무한 루프가 발생할 수도 있기에.
  • 그래서 보통 부모에서 자식으로 단방향 연결을 더 선호함.
  • 다만, 코드 작성은 자식 엔터티에서 @ManyToOne을 사용해야 함.
  •  
// StockEntity

@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor
@SuperBuilder
@Table(name = "stock")
public class StockEntity extends CreateEntity {

    @Id
    @Column(name = "stock_id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long stockId;


}


// DetailStockEntity

@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor
@SuperBuilder
@Table(name = "detail_stock") // JPA는 언더스코어로 구분
public class DetailStockEntity extends CreateEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long detailStockId;

    @NotNull
    private String stockName;

    @ManyToOne
    @JoinColumn(name = "stock_id")
    private StockEntity stock;

}

5. @OneToMany, @ManyToOne

  • @OneToMany: 많은 수의 자식 엔터티가 하나의 부모 엔터티에 속하는 관계를 나타냄.
  • @ManyToOne: 하나의 부모 엔터티가 많은 수의 자식 엔터티를 갖는 관계를 나타냄.

6. 정확한 소수 값 저장을 위해선 BigDecimal

  • Java에서 BigDecimal 타입으로 저장한다면 MySQL에서는 decimal 타입으로 생성.