Id를 직접 할 당할 경우 : @Id Id를 자동 생성 할 경우 @GeneratedValue (쉬운 예로 db의 Auto로 시퀀스 값을 올려주는 기능) IDENTITY : 데이터베이스에 위임, MYSQL (나는 잘 모르겠고 db야 너가 알아서 해주라 라는 느낌) > 기본 키 생성을 데이터베이스에 위임 > 주로 MySql, PostgreSQL, SQL server, DB2에서 사용 (예: MySQL의 AUTO_INCREMENT) > JPA는 보통 트랜잭션 커밋 시점에 INSERT SQL 실행 > AUTO_INCREMENT는 데이터베이스에 INSERT SQL을 실행한 이후에 ID 값을 알 수 있음 > DENTITY 전략은 em.persist() 시점에 즉시 INSERT SQL 실행 하고 DB에서 식별자를 조..
요구사항 추가 - 회원은 일반 회원과 관리자로 구분해야한다. - 회원 가입일과 수정일이 있어야 한다. - 회원을 설명할 수 있는 필드가 있어야 한다. 이 필드는 길이 제한이 없다. package helloJpa; import javax.persistence.*; import java.util.Date; @Entity @Table(name="member") //해주지 않는 경우 클래스 네임이 테이블네임이 된다. public class Member { @Id private Long id; @Column(name = "name") //db에는 name으로 들아간다. private String username; private Integer age; @Enumerated(EnumType.STRING) //db에는..
** 주의 : 운영에선 사용하면 안된다. - DDL을 애플리케이션 실행 시점에 자동 생성 - 테이블 중싱 - > 객체 중심 - 데이터베이스 방언을 활용해서 데이터베이스에 맞는 적절한 DDL 생성 - 이렇게 생성된 DDL은 개발 장비에서만 사용 - 생성된 DDL은 운영서버에서는 사용하지 않거나, 적절히 다듬은 후 사용 persistence.xml 안에 다음 내용을 추가한다. 기동 시에 로그확인 (현재 member 클래스만 있다) Hibernate: drop table member if exists Hibernate: create table member ( id bigint not null, name varchar(255), primary key (id) ) drop을 날린 후 create가 된다. - hi..
- 객체와 테이블 매핑 : @Entity, @Table - 필드와 컬럼 매핑 : @Column - 기본 키 매핑 : @Id - 연관관계 매핑 : @ManyToOne, @JoinColumn @Entity - @Entity가 붙은 클래스는 jpa가 관리, 엔티티라 한다. - JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 필수 - 주의 ㄴ 기본 생성자 필수(파라미터가 없는 public 또는 protected 생성자) ㄴ final 클래스, enu,, interface, inner 클래스 사용 x ㄴ 저장할 필드에 final 사용 x @Entity 속성 - name ㄴ JPA에서 사용할 엔티티 이름을 지정한다. ㄴ 기본값 : 클래스 이름을 그대로 사용 (예: Member) ㄴ 같은 클래스 이름이 없으..
준영속 상태 - 영속 -> 준영속 - 영속 상태의 엔티티가 영속성 컨텍스트에서 분리(detached) - 영속성 컨텍스트가 제공하는 기능을 사용 못함 Member member = entityManager.find(Member.class, 150L); member.setName("adfadaf"); entityManager.detach(member); //영속성 컨텐츠에서 제외 시켜버린다. 그러므로 커밋시점에 아무 일도 일어나지 않는다. ts.commit(); 이렇게 사용하면 detach에서 영속 컨텍스트에서 제외시켜버린다. 영속 상태였다가 영속 상태에서 빠지면 준영속 상태라 말한다. - em.detach(entity) : 특정 엔티티만 준영속 상태로 전환 - em.clear() : 영속성 컨텍스트를 완전..
플러시 - 영속성 컨텍스트의 변경내용을 데이터베이스에 반영 플러시 발생 - 변경 감지 - 수정된 엔티티 쓰기 지연 SQL 저장소에 등록 - 쓰기지연SQL저장소의 쿼리를 데이터베이스에 전송(등록,수정,삭제 쿼리) 영속성 컨텍스트를 플러시 하는 방법 - em.flush() 직접호출 - 트랜잭션 커밋 - 플러시 자동 호출 - JPQL 쿼리 실행 - 플러시 자동 호출 만약 아래와 같이 flust()를 직접 호출할 경우 Member member = new Member(200L, "member200"); entityManager.persist(member); entityManager.flush();//즉시 디비에 쿼리를 날린다. System.out.println("======"); ts.commit(); Hiber..
Member member = entityManager.find(Member.class, 150L); member.setName("zzzzzz"); ts.commit(); Hibernate: /* update helloJpa.Member */ update member set name=? where id=? 업데이트 쿼리를 날린 적이 없는데도 업데이트가 되어버린다. 그저 값을 set했을 뿐인데? 1차 캐시안에 스냅샷이라는 것이 있다. 이 스냅샷이란 값을 딱 읽어온 그 시점을 떠놓은 것이다. 그런 상태에서 entity가 변경 될 경우 비교를 한 뒤에 -> 다를 경우 쓰기 지연 SQL 저장소에 updateSql을 저장하며 커밋하는 시점에 업데이트 쿼리를 날린다.
쓰기 지연 SQL 저장소 - persist()를 사용했을 때 1차캐시에만 저장되는 것이 아니라, insertSql의 경우 "쓰기지연SQL저장소"에 저장 된다. 커밋 시점에 db에 보낸다. persistence.xml에서 관리 할 수도 있음 Member member1 = new Member(150L, "a"); Member member2 = new Member(160L, "b"); entityManager.persist(member1); entityManager.persist(member2); System.out.println("=======쓰기 지연 sql 저장소 이후======"); ts.commit(); 이런 것을 잘 사용하면 성능을 잘 먹고 사용할 수 있다.
- Total
- Today
- Yesterday
- JPA
- 로그인
- 예외처리
- SpringBoot
- hypertexttransferprotocol
- jpa api
- ArgumentResolver
- 스프링부트
- BindingResult
- 백엔드 개발자 역량
- exception
- Java
- HTTP
- 컨트
- 리터럴
- 항해플러스
- thymleaf
- Intercepter
- 스프링공부
- 향해플러스
- reject
- react실행
- filter
- React
- 항해99
- 인터셉터
- 향해플러스백엔드
- 백엔드 개발자 공부
- 향해99
- rejectValue
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |