[JPA] CRUD 간단한 쿼리 실습해보기
1. pom.xml 과 persistence.xml 파일 설정 (이 부분은 여기서 확인 가능!)
2. App.java (main) 메인을 작성해놓고 그냥 testcode로 실습하였다. (AppTest.java)
3. Major 전공 (필드 : id, majorName) / Student 학생정보 (필드: id, studentName, majorid) 클래스 생성
간단하게 학생정보 안에 전공 테이블의 전공id값을 넣으려는 것!
쿼리문으로 짜려면 join으로 선택하여 넣고 빼고 다 해야하는데... 이걸 자동으로 해주다니....!
** Major 클래스 생성
1. 테이블 엔티티 생성 : @Entity
2. 프라이머리 키값 설정 : @Id
3. 프라이머리 키 밸류 설정 : 시퀀스로 설정하고 싶다. @GeneratedValue 애너테이션 활용. (관련 자세한 시퀀스 설정은 여기)
4. 컬럼은 id, majorName
5. Getter/Setter 메서드 생성
** Student 클래스 생성
1. 똑같이 테이블 엔티티 생성 : @Entity
2. 프라이머리 키값 설정 : @Id
3. 프라이머리 키 밸류 설정 : 시퀀스로 설정하고 싶다. @GeneratedValue 애너테이션 활용. (관련 자세한 시퀀스 설정은 여기)
4. 컬럼은 id, studentName
** 5. 학생 별로 전공정보를 주기 위해서 필드 값을 private Major major;로 주고, @JoinColumn(name = "majorid") 그리고
어떤 관계인지 설정하기 위해서 : @ManyToOne 애너테이션 활용. (여러 명의 학생은 하나의 전공에 속할 수 있다.)
5. Getter/Setter 메서드 생성 > 그러면 getMajor()과 setMajor(Major major)도 생긴다.
package dev.syntax.model;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.SequenceGenerator;
@Entity
@SequenceGenerator(
name="student_seq_gen",
sequenceName="student_seq",
initialValue=1,
allocationSize=1)
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "student_seq_gen")
private int id;
@Column(nullable = false)
private String studentName;
@ManyToOne
@JoinColumn(name = "majorid")
private Major major;
public Student() {
super();
}
public Student(String studentName, Major major) {
super();
this.studentName = studentName;
this.major = major;
}
public Student(String studentName) {
super();
this.studentName = studentName;
}
public Major getMajor() {
return major;
}
public void setMajor(Major major) {
this.major = major;
}
// ...
}
그러면 실제로 testcode에서 하나씩 실험 해보자~ (계속 클래스 생성하고 해보기 귀찮아서...)
** Tip **
테스트 시 @BeforeEach, @AfterEach 애너테이션하고 메서드 활용해서 메서드 전과 후에 실행하는 로직을 미리 짜두면 편하다!
우리는 계속 팩토리와 매니저, 트랜잭션까지 생성을 해줘야 하기 때문에 만들어주고, 끝나면 닫아주는 로직을 썼다.
class AppTest {
EntityManagerFactory factory;
EntityManager manager;
EntityTransaction tx;
@BeforeEach
void setUp() {
factory = Persistence.createEntityManagerFactory("step02");
manager = factory.createEntityManager();
tx = manager.getTransaction();
}
@AfterEach
void tearDown() {
if (manager != null) {
manager.close();
}
if (factory != null) {
factory.close();
}
}
}
이러면 모든 테스트 메소드 실행 전후로 실행이 된다.
이제 진짜 쿼리 실습 해보자~~~~!~!~!
1. CREATE !
1) 트랜잭션 시작
2) 컴공 Major 객체 생성
3) manager.persist(cs); 로 영속성 컨텍스트에 밀어넣기
4) 솔하 유신 Student 객체 생성
5) manager.persist(); 로 영속성 컨텍스트에 밀어넣기
6) tx.commit(); 로 영속성 컨텍스트의 엔티티를 DB로 저장해주기.
@Test
void testSave() {
tx.begin();
// 컴퓨터 공학과 저장
Major cs = new Major("컴퓨터 공학과");
manager.persist(cs);
// 학생 2명 생성
Student jo = new Student("솔하", cs);
Student kang = new Student("유신", cs);
manager.persist(jo);
manager.persist(kang);
tx.commit();
}
2. READ !
1) 조회 시에는 트랜잭션이 필요하지 않다.
2) manager.find(엔티티클래, 프라이머리키); 로 id를 통해 엔티티 찾기 가능
3) 학생 엔티티로 getMajor()메소드를 통해 전공도 조회 가능
@Test
void testRead() {
// id가 1인 학생 엔티티 조회
Student s1 = manager.find(Student.class, 1);
// 해당 학생의 전공 조회
Major m1 = s1.getMajor();
}
3. UPDATE !
1) 트랜잭션 시작
2) 학생 조회 (manager.find();)
3) 새로운 전공 추가 (Major 객체 생성) 후 manager.persist(); 잊지 말기
4) 조회한 학생의 전공을 다시 설정 (setMajor()메소드 활용) //이 때 set해준 경우에는 굳이 persist()할 필요가 없다!
5) tx.commit(); 로 영속성 컨텍스트의 엔티티를 DB로 저장해주기.
@Test
void updateRelation() {
// 한 명의 학생 조회 후 해당 학생의 전공을 다른 학과로 변경
tx.begin();
Student s1 = manager.find(Student.class, 1);
Major m2 = new Major("영어교육과");
manager.persist(m2);
s1.setMajor(m2);
tx.commit();
}
4. DELETE !
1) 트랜잭션 시작
2) 학생 조회 (manager.find(Student.class, 1);)
3) 그 학생의 전공 조회 (manager.find(Major.class, s1.getMajor().getId());)
4) 전공 설정 값을 없애기 null로 설정 (setMajor() 메소드 활용)
5) manager.remove(m1); 로 전공 정보 삭제 가능. >> 이 땐 영속성 컨텍스트에 밀어넣을 필요가 없다. 영속성 컨텍스트에서 삭제된 상태...(DB에서는 삭제된 상태가 아님)
6) tx.commit(); 로 영속성 컨텍스트의 엔티티를 DB로 저장해주기.
@Test
void deleteEntity() {
// 한 명의 학생 조회 후 해당 학생의 전공을 제적
tx.begin();
Student s1 = manager.find(Student.class, 1);
Major m1 = manager.find(Major.class, s1.getMajor().getId());
s1.setMajor(null);
manager.remove(m1);
tx.commit();
}
이렇게 하면 기본적인 crud를 다 할 수 있다~~~~!! 우왕~~~~~!
재밌다 재밌어!!!!!! ^____^
'Programming > Spring, SpringBoot' 카테고리의 다른 글
순환 참조 에러 (1) | 2023.10.31 |
---|---|
REST API (Representational State Transfer) (0) | 2023.10.31 |
[JPA] 오라클의 경우 시퀀스 값이 공유되는 문제 (@GeneratedValue 설정시) (0) | 2023.10.27 |
[JPA] 영속성 컨텍스트 라이프사이클 (1) | 2023.10.26 |
[JPA] JPA Entity (4) | 2023.10.25 |