DB를 포커스를 둔 프로젝트를 할 것이다.
기본 셋팅은 똑같고
Lombok, Spring Web, Spring Data JPA, Thymeleaf, Oracle Driver
5개 해준다.
똑같이 임포트해주고 애플리케이션 프로퍼티즈는 웹에있던걸로 복붙.
core2에 있던 애플리케이션 프로퍼티즈 #DB Connection 부분 5줄 복붙
서버가동해서 index.html파일 만든거 잘 나오는지 확인하기
우리는 Hibernate라는 곳에서 구현해놓은 기술을 가져다 쓸 것이다.
보통 Hibernate를 많이 사용한다.
프로젝트로 들어가서
애플리케이션 프로퍼티즈
#DB Connection 부분 주석처리하고
리소스 밑에다가 META-INF라는 폴더 만들고 XML형식의 파일을만든다.
persistence.xml
밑에 디자인보기 방식 말고 Source보기 방식의 탭을 고른다.
<persistence version="2.2"
xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd">
<persistence-unit name="hello">
<properties>
<!-- 필수 속성 -->
<property name="javax.persistence.jdbc.driver" value="oracle.jdbc.driver.OracleDriver" />
<property name="javax.persistence.jdbc.user" value="jpa" />
<property name="javax.persistence.jdbc.password" value="jpa" />
<property name="javax.persistence.jdbc.url" value="jdbc:oracle:thin:@localhost:1521:xe" />
<property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" />
<!-- <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQL10Dialect"/> -->
<property name="hibernate.hbm2ddl.auto" value="create" />
<!-- 옵션 -->
<!-- 콘솔에 하이버네이트가 실행하는 SQL문 출력 -->
<property name="hibernate.show_sql" value="true" />
<!-- SQL 출력 시 보기 쉽게 정렬 -->
<property name="hibernate.format_sql" value="true" />
<!-- 쿼리 출력 시 주석(comments)도 함께 출력 -->
<property name="hibernate.use_sql_comments" value="true" />
</properties>
</persistence-unit>
</persistence>
이거 복붙한다.
필수 속성 부분에 jpa가 아이디 비번이라 우리같은 경우에는 spring으로 바꿨다.
주석 처리된 부분에는 PostgreSQL할때 바꾸는 것을 할거라 나중에 해볼것임
com.codingbox.jpa패키지 밑에다가 Member라는 클래스를 만들었다.
JpaMain을 만들었는데 오랜만에 메인 메서드가 있는 채로 만든다.
하다가 갑자기
xml파일에서
<property name="hibernate.hbm2ddl.auto" value="none" />
으로 바꾼다
create면 새로만드는 거고 none면 있던거에서 덮어쓰는기능이다.
-----day08끝----09시작--- 너무많으니까 그냥 1부터 다시가자.
JpaMain.java에서 페이징 처리하는 부분과 select부분을 추가해주었다.
persistence.xml 에서 어제잠깐이야기했던 오라클다이얼렉 주석처리하고 포스트그레스 sql주석풀어서 확인만 해보았다. 하지만 우린 postgresql을 설치안했으니까 에러가 날것이다. 그냥 다시 오라클로 바꿨다.
비영속(new/transient)
영속성 컨텍스트와 전혀 관계가 없는 새로운 상태
영속(managed)
영속성 컨텍스트에 관리되는 상태
준영속(detached)
영속성 컨텍스트에 저장되었다가 분리된 상태
삭제(removed)
삭제된 상태
영속성 컨텍스트와 식별자 값
-> 엔티티를 식별자 값(@Id로 테이블의 기본 키와 미핑한 값)으로 구분
-> 영속 상태는 식별자 값이 반드시 있어야 한다.
-> 식별자 값이 없으면 예외 발생
영속성 컨텍스트와 데이터베이스 저장
-> JPA는 보통 트랜젝션을 커밋하는 순간 영속성 컨텍스트에 새로 저장된 엔티티를 데이터베이스에 반영
-> 플러쉬(flush)
tx.begin();
em.persist(memberA);
em.persist(memberB);
// 여기까지 insert SQL을 데이터베이스에 보내지 않는다.
tx.commit();
// commit하는 순간 데이터베이스에 Insert SQL을 보낸다.
tx.begin();
//조회
Member memberA = em.find(Member.class, "memberA");
//영속 엔티티 데이터 수정
memberA.setUsername("hi");
memberA.setAge(10);
//em.update(member); // 뭐 이런 코드가 있어야할 느낌인데 이런 코드 없이도 update가능하다.
tx.commit();
이건 나중에~
(영속상태: 1차 캐시 상태)
STS로 돌아와서 Member.java에
@Table(name="MBR")
를 추가했다.
import javax.persistence.Table;
이거를 임포트해야한다.
persistence.xml을 본다.
hibernate.hbm2ddl.auto라는 속성이 있다.
개발단계에서는 보통 create을 사용한다. create와 none을 많이 사용한다.
----------------점심
다시 create로 만들어주고 Member테이블에 추가했던 name을 주석처리해주었다
Member2.java만들었다.
@Id : 직접 할당
@GeneratedValue : 자동 생성
-> IDENTITY : 데이터베이스에 위임
-> SEQUENCE : 데이터베이스 시퀀스 오브젝트 사용
ORACLE(@SequenceGenerator 라는 어노테이션이 필요하다)
-> TABLE : 키 생성용 테이블 사용, 모든 DB에서 사용 가능
@TableGenerator 라는 어노테이션이 필요하다
-> AUTO : 방언에 따라 자동 지정, 디폴트 즉 기본값이다.
JPA가 그러려고 쓰는거니까 그냥 AUTO로 하면되지않냐? ㅇㅇ맞다 AUTO가 위 3개중 하나를 선택해줌
AUTO는 DB방언에 맞춰서 IDENTITY, SEQUENCE, TABLE 세개 중 하나가 선택이 된다.