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 |