1장에서는 엔티티 정보에 선언에 대해 알아볼 것이다. 아래는 클래스 다이어그램, ERD 구성이다.
예시) Organization(조직)- OrganizationMember(조직멤버 구성정보) - Member(구성원:조직에는 N명의 멤버들이 있을수 있고, 멤버는 여러조직에 가입할수 있다.
단 조직에 들어간일자, 나온일자, 주조직 여부 등의 정보를 관리해야 되어야 하기도 하고,
실무에서 ManyToMany 를 사용하는건 문제가 많이 생긴다는건 이미 많이 올라와 있다고 해서 생략!
그리고 여기에서는 mainOrganization 하나만 썼지만 실제 OrganizationMember 안에 여러컬럼이 더 추가로 필요로 하였다.
1:N -> 조직 : 조직멤버(구성정보)
1:N -> 구성원 : 조직멤버(구성정보)
아래그림으로 관계는 이해할수 있으리라 생각됩니다.


코드는 한번 훑어보구 2장부터 어노테이션 및 하나하나 풀어보겠습니다.
@Data
@SequenceGenerator(name = "default", sequenceName = "organization_seq", allocationSize = 1)
@Entity
@NamedEntityGraph(name = "graph.OrganizationWithMember", attributeNodes = @NamedAttributeNode(value = "organizationMembers",subgraph = "subgraph.organizationMembers"), subgraphs = {@NamedSubgraph(name = "subgraph.organizationMembers", attributeNodes = @NamedAttributeNode(value = "member", subgraph = "subgraph.member"))})
public class Organization{
    @Id
    private Long id;
    private String organizationCode;
    private String koreanName;
    // 1:N -> 조직 : 조직멤버(구성정보)
    @JsonProperty(access=JsonProperty.Access.READ_ONLY)
    @org.hibernate.annotations.Fetch(FetchMode.SUBSELECT)
    @OneToMany(mappedBy = "organization")
    private List<OrganizationMember> organizationMembers;
}
@Data
@SequenceGenerator(name = "default", sequenceName = "organization_member_seq", allocationSize = 1)
@Entity
@NamedEntityGraph(name = "OrganizationMembers.memberList", attributeNodes = @NamedAttributeNode("member"))
public class OrganizationMember {
    @Id
    Long id;
    @ManyToOne
    @JsonProperty(access=JsonProperty.Access.READ_ONLY)
    @JoinColumn(name = "organization_id")
    @MapsId("organization_id")
    @AttributeOverride(name="id", column=@Column(name="organization_id"))
    private Organization organization;
    @ManyToOne
    @JsonProperty(access=JsonProperty.Access.READ_ONLY)
    @JoinColumn(name = "member_id")
    @MapsId("member_id")
    @AttributeOverride(name="id", column=@Column(name="member_id"))
    private Member member;
    private Boolean mainOrganization;
}import com.fasterxml.jackson.annotation.JsonProperty;
import jdk.jfr.Name;
import lombok.Data;
import org.hibernate.annotations.FetchMode;
import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
@Data
@SequenceGenerator(name = "default", sequenceName = "member_seq", allocationSize = 1)
//조인을 하기위한 서술
@NamedEntityGraph(name = "graph.MemberWithMainOrganization"
        , attributeNodes = @NamedAttributeNode(value = "organizationMembers",subgraph = "subgraph.organizationMembers")
        , subgraphs = {@NamedSubgraph(name = "subgraph.organizationMembers"
        , attributeNodes = @NamedAttributeNode(value = "organization", subgraph = "subgraph.organization"))})
@Entity
public class Member {
    @Id
    private Long id;
    private String empId;
    private String koreanName;
    @JsonProperty(access=JsonProperty.Access.READ_ONLY)
    @org.hibernate.annotations.Fetch(FetchMode.SUBSELECT)
    @OneToMany(mappedBy = "member")
    private List<OrganizationMember> organizationMembers ;
}
'Web개발 > JPA' 카테고리의 다른 글
| Spring data rest is Null 이나 is Not null (0) | 2021.04.21 | 
|---|---|
| Projection 사용법 & Projection 안에 Projection (0) | 2021.03.17 | 
| JPA 로 프로젝트 하면서 느낀점 (0) | 2021.03.15 | 
| JPA Join 관련 Annotation @NamedEntityGraph , @EntityGraph , FetchType (0) | 2021.03.10 | 
| @Entity 선언시 pk 역할 (0) | 2020.06.30 |