관리 메뉴

Mini

엔티티 설계시 주의점 // Setter제거 본문

Java/Spring-app

엔티티 설계시 주의점 // Setter제거

Mini_96 2023. 6. 6. 19:45

* Setter제거

문제 : Setter 무분별허용 => 오브젝트가 어디서 수정됬는지 모름 => 유지보수어렵

해결? : ??? 뒷강의(어플개발강의)에서 Setter없이 개발하는것을 보여주겠다. 

 

*LAZY(지연로딩)

※ 절대 Eager을 사용하면 안된다.

문제 : @XToOne 은 기본값이 즉시로딩(Eager) => 연관된애들 다땡겨옴, N(결과쿼리)+1(Order 쿼리) 문제.

해결 : @XToOne(fetch=FetchType.LAZY)

1. 패키지에서 C Shift F : OneToOne, ManyToOne 모두 찾기

2 . fetch 변경

    @OneToOne(fetch = LAZY,mappedBy = "delivery")
    private Order order;

 

*컬렉션 초기화 문제

문제 : 메소드초기화등등 사용하면 -> 널문제, 하이버네이트 매커니즘 안맞음 문제

해결 : 필드에서 초기화 하라.

@OneToMany(mappedBy = "order")
    private List<OrderItem> orderItems= new ArrayList<>();

 

*DB이름 명명규칙

기본 : 캐멀->언더 (javaSpring ->java_spring)

 

문제 : 회사에서 앞에 커스텀 XXorder등 붙이라고함

해결 : ImplicitNamingStrategy 수정하면됨.

 

*Casade

기존문제 : persist(orderItemA)  persist(orderItemB)  persist(orderItemC) 각각저장후  persist(order) 저장 해야함.

 @OneToMany(mappedBy = "order")
    private List<OrderItem> orderItems= new ArrayList<>();

    persist(orderItemA);
    persist(orderItemB);
    persist(orderItemC);
    persist(order);

해결: Cascade => persist자동전파.

    @OneToMany(mappedBy = "order", cascade = CascadeType.ALL)
    private List<OrderItem> orderItems= new ArrayList<>();

    persist(order);

 

* 연관관계 편의 메서드

기존 : 운영단계에서 member에 order넣고, order에 멤버넣어야됨. => 누락문제

 public void setMember(Member member){
        this.member=member;
    }

    public static void main(String[] args){
        Member member=new Member();
        Order order=new Order();
        
        member.getOrders().add(order);
        order.setMember(member);
    }

해결 : 연관관계 편의 메서드  // 운영에서 한줄 누락해도 됨.

    //연관관계 편의 메서드
    public void setMember(Member member){
        this.member=member;
        member.getOrders().add(this);
    }
    //연관편의메서드
    public void addChildCategory(Category child){
        this.child.add(child);
        child.setParent(this);
    }