728x90
@Repository
@Transactional(readOnly = true)
public class SimpleJpaRepository<T, ID> implements JpaRepositoryImplementation<T, ID>
실제 구현체가 들어있는 클래스이다.
@Repository
1. Component Scan 의 대상이 되어 Spring Container 에 올라감
2. JDBC, JPA Exception 이 터질때 이것들을 Spring Exception 으로 바꿔서줌
Spring data jpa 에서의 save는
@Transactional
@Override
public <S extends T> S save(S entity) {
Assert.notNull(entity, "Entity must not be null.");
if (entityInformation.isNew(entity)) {
em.persist(entity);
return entity;
} else {
return em.merge(entity);
}
}
새것이 아니면 즉 id 값이 null 이 아니면 merge를 호출한다.
@GenerateValue 를 통해서 Entity 의 ID를 생성하게 된다면 persist한후에 ID가 db에 의해서 생성됨으로 처음에 isNew
에서 null 로 서 참이되겠지만
그게아니라 자기가 임의로 ID값을 임의로 생성자를 통해 부여하게 된다면 merge를 호출하게 되는데 merge는 db에 이미 같은 ID가 있다고 가정하고 select 쿼리를 한번 날리기 떄문에 비효율적이다.
이럴떄는
@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Item implements Persistable<String>
{
@Id
private String id;
@CreatedDate
private LocalDateTime createdDate;
@Override
public String getId()
{
return null;
}
@Override
public boolean isNew()
{
return createdDate == null;
}
}
isNew를 로직을 실무에서는 이렇게 사용한다고 한다.
복잡한 Specification , Criteria 쓰는것 (안씀)
Projection = Dto 처럼 원라는 column만 조회할 수있게 도와줌
native Sql
@Query(value = "select * from member where username =?", nativeQuery = true)
Member findByNativeQuery(String username);
Query Dsl 을 써야한다.
728x90
'WEB > JPA' 카테고리의 다른 글
실전 QueryDsl 3 (중급문법 , 순수 JPA) (0) | 2021.04.20 |
---|---|
실전! QueryDsl 1,2 (설정 ,문법) (0) | 2021.04.16 |
실전! Spring Data JPA 3(확장기능,Auditing ,Page) (0) | 2021.04.13 |
실전! Spring Data JPA 1,2(공통 인터페이스 기능, 쿼리 메소드 기능) (0) | 2021.04.12 |
실전! 스프링부트와 JPA와 활용2 (OSIV와 성능 최적화) (0) | 2021.04.06 |