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 ;
}

+ Recent posts