본문 바로가기

프로그래밍/JPA

JPA_테이블 생성

1. JPA 활용해서 테이블 설계 및 생성 (User, Board, Reply)

User.java

1
2
3
4
5
6
7
8
9
10
11
12
@Entity 
public class User {
 
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    private String username;
    private String password;
    private String email;
    private Timestamp createdDate;
 
}
cs

 

Board.java

1
2
3
4
5
6
7
8
9
10
11
12
@Entity
public class Board {
 
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    private String title;
    private String content;
    // private User user;
    private Timestamp createdDate;
 
}
cs


Reply.java

1
2
3
4
5
6
7
8
9
10
11
12
@Entity
public class Reply {
 
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    private String content;
    // 어느 게시글에 작성된 댓글
    // 누가 작성한 댓글
    private Timestamp createdDate;
 
}
cs

 

 

2. JPA를 활용해서 테이블 컬럼에 제약 설정 및 외래키 지정하기

User.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@Entity 
public class User {
 
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    
    @Column(nullable = falselength = 30)
    private String username;
    
    @Column(nullable = falselength = 100)
    private String password;
    
    @Column(nullable = falselength = 50)
    private String email;
    
    // default 값을 user로 설정
    @ColumnDefault("'user'"// 문자열 타입이라고 명시는 ''(홑따옴표)
    private String role;
    
    @CreationTimestamp // 자동 시간 입력 == now()
    private Timestamp createdDate;
    
}
cs

 

Board.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@Entity
public class Board {
 
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    
    @Column(nullable = falselength = 100)
    private String title;
    
    @Lob // 대용량 데이터
    private String content;
    
    @ColumnDefault("0"// 숫자형은 - "숫자"
    private int count;
    
    // Board : User = N : 1
    @ManyToOne
    @JoinColumn(name = "user_id")
    private User user;
    
    @CreationTimestamp // now()
    private Timestamp cratedDate;
    
}
cs

 

Reply.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@Entity
public class Reply {
 
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    
    @Column(nullable = falselength = 255)
    private String content;
    
    // Reply : User = N : 1
    @ManyToOne
    @JoinColumn(name = "user_id")
    private User user;
    
    // Reply : Board = N : 1
    @ManyToOne
    @JoinColumn(name = "board_id")
    private Board board;
    
    @CreationTimestamp
    private Timestamp createdDate;
}
cs

 

 

Board 테이블을 가지고 올 때 Reply에 대한 데이터도 필요하다면 mapped를 설정해줄 수 있다. 

1
2
3
4
5
6
7
8
9
// !!!! 리플에 대한 정보가 없음 
// Board 정보를 가지고 올 때 댓글 정보도 가지고 와야 된다면 ?
// Board와 Reply의 관계는 1 : N
@OneToMany(mappedBy = "board", fetch = FetchType.LAZY) // 기본값
private List<Reply> reply;
// 주의 : Board 테이블에 reply_id 컬럼이 필요한가 (X)
// mappedBy 설정하면 board 테이블에 컬럼이 생성되지 않는다.
// 오브젝트가 생성될 때 즉 데이터를 가지고 올 때 알아서 join 처리해서
// 데이터만 가지고 와라 라는 의미
cs

→ 연관 관계의 주인이란 ? FK 컬럼을 들고 있는 테이블의 주인이다. 

 

 

Board.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
@Entity
public class Board {
 
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    
    @Column(nullable = false, lenth = 100)
    private String title;
    
    @Lob // 대용량 데이터 
    private String content;
    
    // Board : User = N : 1
    @ManyToOne
    @JoinColumn(name = "user_id")
    private User user;
    
    // !!!! 댓글에 대한 정보가 없음 
    // Board 정보를 가지고 올 때 댓글 정보도 가지고 와야 한다면 ? 
    // Board : Reply = 1 : N
    @OneToMany(mappedBy = "board", fetch = FetchType.LAZY) // FetchType.LAZY - 기본값
    private List<Reply> reply;
    // 주의 : Board 테이블에 reply_id 컬럼이 필요한가(X)
    // mappedBy 설정하면 board 테이블에 컬럼이 생성되지 않는다.
    // 오브젝트가 생성될 때 즉 데이터를 가지고 올 때 알아서 join 처리해서 
    // 데이터만 가지고 와라
    
    @CreationTimestamp
    private Timestamp createdDate;
 
}
cs

'프로그래밍 > JPA' 카테고리의 다른 글

JPA_JPA yml 파일 설정  (0) 2023.06.06
JPA_더티체킹(dirty checking)  (0) 2023.05.13
JPA_Pageable 페이징 처리  (0) 2023.05.13
JPA_JPA와 connection pool  (0) 2023.05.13