[jpa]테이블 구조에 따라 Entity class
1-1. Master-Detail, Detail테이블에 master 외래키
public class Master {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private String name;
}
public class Detail {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long mid;
private String description;
@OneToOne
private Master master;
}
장점: Master모르게(수정없이) Detail기능을 추가 할 수 있음.
단점: Master조회 하는걸로는 Detail을 불러오지 못함.
Master id로 Detail을 불러야 Master까지 불러옴.
1-2. Master-Detail, Detail테이블에 master 외래키
public class Master {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private String name;
@OneToOne(mappedBy = "master")
private Detail detail;
}
public class Detail {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long mid;
private String description;
@OneToOne
private Master master;
}
단점: Master를 수정해야 함. (그 전에 잘 돌고 있었다면, 수정할 부분이 생길꺼임)
3. Master-Detail, Master테이블에 detail 외래키
public class Master {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private String name;
@OneToOne
private Detail detail;
}
public class Master {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private String name;
}
4. Master-Detail PK 공유
public class Master {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private String name;
@OneToOne
@PrimaryKeyJoinColumn
private Detail detail;
}
public class Detail {
@Id
private Long id;
private String description;
@OneToOne
@MapsId
private Master master;
}
Detail에 @GeneratedValue(strategy = GenerationType.IDENTITY) 를 없애고, @MapsId를 추가함
이대로면 Detail테이블에 master_id라는 pk가 만들어지는데, id를 다른 이름으로 바꿔도 master_id로 만들어짐.
id는 java에서 Detail의 PK를 담기위한 java에서만 쓰는 이름이 되나봄.
master를 저장하려면 PK가 null인상태로 Master, Detail을 만들고 Master만 save 할줄 알았는데,
(원래 하던거처럼) master먼저 만들고, detail에 id가 있는 master를 넣고 detail save
Master master = new Master();
masterRepository.save(master);
Detail detail = new Detail();
detail.setDescription("aaaaa");
detail.setMaster(master);
detailRepository.save(detail);
5. Master-Detail 사이에 중간 테이블
public class Master {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private String name;
@OneToOne
@JoinTable(name = "master_vs_detail")
private Detail detail;
}
public class Detail {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String description;
}
@JoinTable에 name 없으면 서버 안켜짐. 무조건 있어야 하나 봄.
6. Father-Child, Child테이블에 Father 외래키
public class Father {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
}
public class Child {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
private Father father;
}
7. Category-Board, Board테이블에 category 외래키
Board Entity는 category에 대한 정보를 관리하지 않음.
모든 Board row는 정확히 하나의 category에 속함.
public class Category {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToMany(fetch = FetchType.EAGER)
private List<Board> boards = new ArrayList<>();
}
특정 카테고리를 선택 후, 게시글을 검색하는거라고 치면,,
즉, 특정 카테고리에 대해 조회 후, 게시글이 특정지어진다고 치면
게시글목록은 CategoryRrepository를 통해 조회. BoardRepository 가 아니라.
8. User-Language(class)
User마다 여러 language선택
Language는 코드로 관리
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@ElementCollection(fetch = FetchType.LAZY)
@CollectionTable(name = "user_language")
@ToString.Exclude
private List<Language> languages = new ArrayList<>();
}
public class Language {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String cd;
private String nm;
}
User, Language사이의 중간테이블 "user_language"로 관리.
user_language테이블은 User의 id, Language의 id 2개의 컬럼으로 구성
9. Content-Hashtag(String)
Hashtag는 String(primitive type)
public class Content {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@ElementCollection(fetch = FetchType.LAZY)
@CollectionTable(name = "hashtag")
@ToString.Exclude
private List<String> hashtags = new ArrayList<>();
}
hashtag테이블은 따로 관리.
hashtag테이블은 Content의 id, hashtag String값 2개의 컬럼으로 구성