[JPA] 트러블이슈
BackEnd/패캠 2022. 2. 9. 15:31

- 한 엔티티(b)와 연관관계를 맺는 엔티티(b)가 있다면, a의 b를 호출 때만 b가 조회하는 것은 지연로딩(lazy fetch)이고 그런 것 상관 없이 a가 호출될 때 b도 항상 같이 조회(eager fetch)하는 것이 즉시 로딩이다. - a엔티티의 b속성 위에 @ManyToOne(fetch=FetchType.EAGER) 식으로 로딩 시점을 작성해줄 수 있다. 1. 즉시 로딩(EAGER) ㄴ a만 조회해도 b가 실제 객체로 로딩이 된다. ㄴ a를 조회할 때 b까지 조회하므로 b를 이용할 땐 캐쉬에서 가져온다. 따라서 select문이 따로 실행되지 않는다. 2. 지연 로딩(LAZY) ㄴ a엔티티를 조회할 땐 b는 proxy객체로 가져온다. 후에 b를 실제로 사용하는 시점에 b가 조회되는 쿼리가 실행되..

[JPA] Converter
BackEnd/패캠 2022. 2. 7. 15:30

Converter * db값과 객체에 넣을 값이 다르다면 컨버터를 사용한다. * 엔티티의 속성 중에 연관관계가 없는 클래스 타입이 있다면, 이걸 convert해야 db에 잘 넣을 수 있고 반대로 db에서 값을 읽어와서 객체로 넣어줄 수 있다. * 속성으로 넣을 클래스 만들기(db값과 객체의 값 두개 다 속성으로 가지는 클래스) -> converter 클래스만들어서 값 convert하기 *컨버터 클래스는 AttributeConverter 인터페이스를 구현한다 AttributeConverter => 여기서 필드타입은 대문자(ex. Integer)로 써줘야함 * 속성위에 @Convert로 해서 컨버터를 지정 => 컨버터에서 속성을 autoApply=true를 하면 해당 타입을 속성들을 자동으로 변환해줌. 따라..

[JPA] @Query
BackEnd/패캠 2022. 2. 5. 15:29

[JPA] 영속성 전이 – Cascade
BackEnd/패캠 2022. 2. 4. 15:28

0. ALL 1. PERSIST -> 저장 2. MERGE -> 연관 관계에 있는 비영속 인스턴스를 영속 인스턴스로 병합 3. REMOVE -> 삭제 4. REFRESH -> 재로딩 5. DETACH 질문 : persist하면 영속상태로 되니까 컨테이너가 관리해서 merge도 자동으로 되는 것 아닌가..? * publisher 엔티티의 books 속성에 값 추가하기 => publisher.getbooks().add(book) 로해도 publisher의 books 값도 같이 변경된다.(call by reference) => 하지만 가독성을 위해 set을 사용하는 것이 좋음(여기선 add메서드를 publisher 클래스에 추가해서 그거 호출) * 1) cascade=persist => 한 엔티티(book)를..

[JPA] 트랜잭션
BackEnd/패캠 2022. 2. 3. 15:28

*트랜잭션의 특징 : acid 원자성 : 전체 성공 or 전체 실패 일관성 : 데이터간의 정확성 독립셩 : 다른 트랜잭션이 중간 연산결과에 접근불가 영속성 : 상태가 영구적으로 db에 저장 * ddl-auto를 create-drop하면 테스트 실행동안 테이블이 생기다가 끝나면 삭제됨 (>>디버그 브레이크 포인트를 통해 테이블 확인할 수 있음) * 테이블에 데이터 추가하는 메서드를 @Transactional로 묶으면 메서드 중간에는 데이터가 추가되지 않고 메서드가 끝나고 한번에 처리됨 ㄴ @Transactional하면 java에서 제공하는 것과 스프링에서 제공하는 것 두가지가 있다. (여기선 스프링걸 써봄) * 메서드가 끝나기 직전에 Exception을 발생하면 어떻게 될까? 1) RuntimeExcept..

[JPA] 영속성
BackEnd/패캠 2022. 2. 2. 15:27

* jpa:generate-ddl: jpa 구현체와 상관없이 자동화된 ddl을 사용하도록 하는 것, Spring Application 실행시점에 Hibernate에서 자동으로 DDL을 생성해서 필요한 데이터베이스의 Table설정을 자동으로 수행 * jpa:hibernate:ddl-auto : 데이터베이스의 초기화 전략 : none / create-drop(시작 할 때 생성, 종료 때 drop) / update(변경된 스키마를 적용) /create(항상 새로 생성) / validate(변경사항이 있으면 변경사항을 출력하고 종료) 중에 값을 가짐 : 위에 generate-ddl값 과 상충하면 ddl-auto를 따름 * datasource:initialization-mode : data.sql, 스키마파일을 ..

[JPA] 연관관계
BackEnd/패캠 2022. 2. 1. 15:28

- 클래스 멤버변수로 다른 클래스를 가지고 싶을 때 JPA에서는 id대신 그 객체 자체를 멤버로 가지고 그걸 @OneToOne .. 으로 설정하면 자동으로 연관관계가 만들어진다. - ERD에 없어도 양방향으로 @~to~를 달아준다. =>실제 db에서는 소유한 클래스의 id가 필드로 추가된다. ㄴ optional = : 해당 클래스는 null값을 가질 수 없다. ㄴ mappedBy=”” 주인이 아닌 클래스에서 역으로 주인을 참조할 때. 속성값으로 자기 자신을 적어준다(?), 이걸 하면 주인 클래스는 컬럼에 추가되지 않는다.(주인 클래스를 소유하지 않았으므로) ㄴ 1. FK가 있는 곳을 주인으로 한다. 2. 객체의 개념에 따라서 Book에도 BookReviewInfo를 추가하고, BookReviewInfo에..

[JPA] EntityListener
BackEnd/패캠 2022. 1. 31. 15:24

@Pre/PostPersist(삽입 전/후), @Pre/PostUpdate(업뎃 전후), @Pre/PostRemove(삭제 전후), @PostLoad(select문 전/후) => 객체에다가 @EntityListener(리스너클래스) 등록해주면 거기에 위의 어노테이션에 따라서 이벤트 처리를 해주는 것 내가 만든 myentityListener를 상속 -> ‘@createdDate, @LastModifiedDate 등록 후 jpaenableAuditing 리스너를 등록한 클래스’를 상속 @EntityListeners(AuditingEntityListener.class 해당 클래스에 Auditing 기능을 포함 @CreatedDate Entity가 생성되어 저장될 때 시간이 자동 저장 @LastModifiedD..

[JPA] QueryMethod 살펴보기
BackEnd/패캠 2022. 1. 30. 00:58

QueryMethod Jpa에서 제공하는 메서드에 +@해서 세부 조건(where)에 해당하는 데이터를 뽑게 해주는 메서드 1. findBy와 동의어들 User findByEmail(String email); User getByEmail(String email); User readByEmail(String email); User queryByEmail(String email); User searchByEmail(String email); User streamByEmail(String email); User findUserByEmail(String email); User findSthByEmail(String email); 2. 서술어 is=equals : 없는것과 동일 Set findUserByName(S..