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 = false, length = 30) private String username; @Column(nullable = false, length = 100) private String password; @Column(nullable = false, length = 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 = false, length = 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 = false, length = 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 |