카테고리를 해보자.
자기 자신을 셀프 맵핑 하는 것은 어떻게 할까?
@Entity
@Getter @Setter
public class Category {
@Id @GeneratedValue
@Column(name = "category_id")
private Long id;
private String name;
@ManyToMany
@JoinTable(name = "category_item",
joinColumns = @JoinColumn(name = "category_id"),
inverseJoinColumns = @JoinColumn(name = "item_id"))
private List<Item> items = new ArrayList<>();
@ManyToOne
@JoinColumn(name = "parent_id")
private Category parent;
@OneToMany(mappedBy = "parent")
private List<Category> child = new ArrayList<>();
}
이론적으로 Getter, Setter 모두 제공하지 않고, 꼭 필요한 별도의 메소드를 제공하는 게 이상적이다. 하지만 실무에서 엔티티의 데이터 조회는 빈번하다. 그래서 열어 줄 수 밖에 없다.
그치만 Setter는 신중하게 열어야 한다. Setter보다는 별도의 변경 용 메소드를 제공하는 것이 좋다.
id는 이름을 명확하게 하는 것이 나중에 보기 좋다. 테이블명_id
값 타입(Address)은 변경이 되면 안된다. 생성만 가능해야 한다. JPA 스펙상 기본 생성자가 있어야 한다. protected로 하나 넣어 두자.
@Embeddable
@Getter @Builder
public class Address {
private String city;
private String street;
private String zipcode;
protected Address() { }
}