LOG
- PR 템플릿, 스프린트 기간 같은 세부 사항들을 정했다. 곧 기능 개발을 할 수 있을 것 같아서 좋다 🥹 얼른 개발하고 싶다
- 요즘 끝나고 프로젝트 관련해서 할 게 없다보니 알고리즘만 푸는 중이다.
배운 것
@Lob
을 사용하면 매핑하는 필드의 타입에 따라 DB의 BLOB, CLOB과 매핑된다.String
,char[]
,java.sql.CLOB
: CLOBbyte[]
,java.sql.BLOB
: BLOB
@Column(name = "contents")
@Lob
private String contents;
- 테이블의 unique 조건은 다음과 같이 정의한다.
@Table(name = "user", uniqueConstraints = @UniqueConstraint(name = "UK_a3imlf41l37utmxiquukk8ajc", columnNames = "user_id"))
@Entity
public class User
Unique 조건의 이름을 지정하지 않으면 vendor가 생성한 값이 들어갈 수 있다.
JPA 2.0 부터 Unique 조건의 이름을 제공할 수 있다.
uniqueConstraints
속성은 배열로 여러 가지 @UniqueConstraint
를 가질 수 있다.
columnNames
속성은 여러 가지를 지정할 수 있다.
- 컬럼의 기본값을 설정하는 방법은 다음과 같다.
@ColumnDefault("-1")
private int score;
// 또는
@Column(columnDefinition = "integer default -1")
private int score;
- 준영속 상태는 다음과 같이 만들 수 있다.
Person person = new Person("vero");
Person savedPerson = personRepository.save(person);
entityManager.detach(savedPerson);
특정 엔티티만 준영속 상태로 전환한다. (준영속 상태가 되면 1차 캐시에서 빠진다)
준영속 엔티티는 영속성 컨텍스트가 더 이상 관리하지 않는 엔티티로, 1차 캐시부터 쓰기 지연 SQL 저장소까지 해당 엔티티를 관리하기 위한 모든 정보가 제거된다.
참고 : https://www.nowwatersblog.com/jpa/ch3/3-6
@Id
컬럼의 이름이 id가 아니더라도 JPA가 기본적으로 제공하는findById
는 사용할 수 있다.- JPA의
@Temporal
어노테이션은LocalDateTime
필드에 사용할 수 없다. - lis 푸는 법을 드디어.. 알아냈다.
궁금한 것
- jpa도 프록시를 쓰나? 엔티티가 빈 생성자를 제공해야 하는 것도 그렇고, 빈 생성자가
private
이면 컴파일 에러가 뜨는 것도 의심스러움- 하이버네이트가 프록시 객체를 통해 지연 로딩을 구현한다.
- 따라서 JPA 엔티티는 final로 정의할 수 없고, 기본 생성자는 최소
protected
접근 제어자를 가져야 한다. - 참고 : https://tecoble.techcourse.co.kr/post/2022-10-17-jpa-hibernate-proxy/
- JDK 17 의 sealed class 도 JPA 엔티티로 쓸 수 없을까?
느낀 것
- 알고리즘 어렵다. 근데 이제는 열심히 하면 잘할 수 있을 것 같다.
- 스타벅스 추워.