Life Developer
인생 개발자
전체 글 (141)
[JPA실전]Spring-boot에서 EntityManager 정의

스프링부트가 다 알아서 해준다.

 

@PersistenceContext 만 해주면 끝.

 

@Repository
public class MemberRepository {

@PersistenceContext
private EntityManager em
;

public Long save(Member member) {
em.persist(member);

return member.getId();
}

public Member find(Long id) {
return em.find(Member.class, id);
}
}

'Developer' 카테고리의 다른 글

[JPA실전]@RequiredArgsConstructor-final 변수들을 생성자로  (0) 2020.09.28
[JPA실전]파라미터 로그 표시  (0) 2020.09.28
[JPA실전]devtools dependency  (0) 2020.09.28
[JPA실전]lombok 다운  (0) 2020.09.28
[JPA실전]시작  (0) 2020.09.28
  Comments,     Trackbacks
[JPA실전]devtools dependency

dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-devtools'
compileOnly 'org.projectlombok:lombok'
runtimeOnly 'com.h2database:h2'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

 

 

 

 

'Developer' 카테고리의 다른 글

[JPA실전]파라미터 로그 표시  (0) 2020.09.28
[JPA실전]Spring-boot에서 EntityManager 정의  (0) 2020.09.28
[JPA실전]lombok 다운  (0) 2020.09.28
[JPA실전]시작  (0) 2020.09.28
[JPA]벌크연산  (0) 2020.09.23
  Comments,     Trackbacks
[JPA실전]lombok 다운

 

 

테스트

 

 

@Getter
@Setter
public class Hello {
private String data;
}

 

 

 

@SpringBootApplication
public class JpashopApplication {

public static void main(String[] args) {
SpringApplication.run(JpashopApplication.class, args);

Hello hello = new Hello();
hello.setData("123");
String data = hello.getData()
;
}

}

'Developer' 카테고리의 다른 글

[JPA실전]Spring-boot에서 EntityManager 정의  (0) 2020.09.28
[JPA실전]devtools dependency  (0) 2020.09.28
[JPA실전]시작  (0) 2020.09.28
[JPA]벌크연산  (0) 2020.09.23
[JPA]JPQL-Named쿼리  (0) 2020.09.22
  Comments,     Trackbacks
[JPA실전]시작

start.spring.io 에서 시작

'Developer' 카테고리의 다른 글

[JPA실전]devtools dependency  (0) 2020.09.28
[JPA실전]lombok 다운  (0) 2020.09.28
[JPA]벌크연산  (0) 2020.09.23
[JPA]JPQL-Named쿼리  (0) 2020.09.22
[JPA]쿼리에 Entity 직접 사용하기  (0) 2020.09.22
  Comments,     Trackbacks
[JPA]벌크연산

벌크연산 - 한방쿼리 - 영속성 컨텍스트 개무시하고 바로 DB에 쿼리 때림 

 

 

 

니 운동 좀 했는갑네.

몸이 벌크업됐노.

 

에서 벌크란 통? 이라고 할수가 있다. 통, 즉, 사이즈가 업됐노.

 

이렇게 생각할수 있는데.

 

벌크연산도 통연산 이라고 해석해도 될거같다.

 

통으로 연산 때리는 거다.

 

쿼리 한번으로 여러 테이블 로우 조져버리는거임.

 

update와 delete를 지원한다.

 

뭐 JPA 표준 스펙에는 없는데 하이버네이트가 지원하는것도 있다.

 

inset into ...select ~~ 이런거.

 

select해서 insert 조지는거...뭐 이런정도?

 

 

int resultCount = em.createQuery("update Member m set m.age=100").executeUpdate();
System.out.println("resultCount = " + resultCount);

 

em.createQuery에 update문 쌔리고 .executeUpdate 때리면 된다.

 

결과값은 변경된 컬럼수가 나옴.

 

========================================================================

 

벌크 연산은 영속성 컨텍스트를 무시해버리고 DB에 직접 쿼리 때린다.

잘못하면 망한다. 어떻게 하느냐? 

 

-벌크 연산 먼저 실행 (flush 자동으로 됨)

-벌크 연산 수행 후 영속성 컨텍스트를 초기화

 

하면 된다.

 

 

아래경우 나이가 모두 100으로 바뀌지 않고 출력이 된다.

 

왜냐면 자동 flush insert 다 때리고 clear를 안해줬으니 영속성 컨텍스트에는 값들이 남아있기 때문에.

 

 

Team team = new Team();
team.setName("teamA");
em.persist(team);

Team team1 = new Team();
team1.setName("teamB");
em.persist(team1);

Member member = new Member();
member.setUsername("userA");
member.setAge(10);
member.setType(MemberType.ADMIN);

Member member1 = new Member();
member1.setUsername("userB");
member1.setAge(70);
member1.setType(MemberType.USER);

Member member2 = new Member();
member2.setUsername("userC");
member2.setAge(90);
member2.setType(MemberType.USER);

member.setTeam(team);
member1.setTeam(team1);
member2.setTeam(team1);

em.persist(member);
em.persist(member1);
em.persist(member2);

//flush 자동 호출
int resultCount = em.createQuery("update Member m set m.age=100").executeUpdate();
System.out.println("resultCount = " + resultCount);

System.out.println("member1.getAge() = " + member.getAge());
System.out.println("member1.getAge() = " + member1.getAge());
System.out.println("member1.getAge() = " + member2.getAge());

System.out.println(" ======================================================= ");
tx.commit(); //이시점에 DB 쿼리가 날라감

 

 

 

그럼 이때는?

 

~

~

~

em.persist(member);
em.persist(member1);
em.persist(member2);


//flush 자동 호출
int resultCount = em.createQuery("update Member m set m.age=100").executeUpdate();
System.out.println("resultCount = " + resultCount);

Member mem = em.find(Member.class, member.getId());

System.out.println("mem = " + mem.getAge());

System.out.println(" ======================================================= ");
tx.commit(); //이시점에 DB 쿼리가 날라감

 

 

 

ㅋㅋ 이때도 mem.getAge 해봤자 100이 안나옴..

 

왜냐하면 벌크연산은 DB로 바로 쿼리를 쳐때려버리고 영속성 컨텍스트를 개무시하니까.

 

즉, 영속성 컨텍스트에 남아있는 em.persist(member); 이 놈을 불러옴.ㅋ....미띤

 

 

그래서 clear를 여기 써주면 새로가져온다

 

int resultCount = em.createQuery("update Member m set m.age=100").executeUpdate();
System.out.println("resultCount = " + resultCount);

em.clear();

Member mem = em.find(Member.class, member.getId());

'Developer' 카테고리의 다른 글

[JPA실전]lombok 다운  (0) 2020.09.28
[JPA실전]시작  (0) 2020.09.28
[JPA]JPQL-Named쿼리  (0) 2020.09.22
[JPA]쿼리에 Entity 직접 사용하기  (0) 2020.09.22
[JPA]다형성 JPQL 쿼리  (0) 2020.09.22
  Comments,     Trackbacks
[JPA]JPQL-Named쿼리

어마어마한 메리트가 있다.

 

Named 쿼리란 미리 정의해서 이름을 부여해두고 사용하는 JPQL이다.

 

정적쿼리..변하지않음..(메리트있음)

 

어노테이션이나 xml에 정의 가능하다.

 

진짜장점 : 애플리케이션 로딩시점에 초기  화 후 재사용, 애플리케이션 로딩시점에 쿼리 검증 가능!!

 

도랐맨. 무슨말.

 

직접해보자.

 

 

Entity
@NamedQuery(name = "Member.findByUsername", query = "select m from Member m where m.username = :username")
public class Member {
@Id
@GeneratedValue
private Long id;
private String username;
private int age;

~

~

~

 

 

이렇게 선언해줌

 

사용은 이렇게.

 

List<Member> resultList = em.createNamedQuery("Member.findByUsername", Member.class).setParameter("username", "userC")
.getResultList();
for (Member mem : resultList) {
System.out.println("mem = " + mem);
}

 

 

그럼 기대값대로 나온다.

 

 

신기한것은 애플 실행할때

 

Named 쿼리에 오타가 있으면 에러발생시킴.

 

@NamedQuery(name = "Member.findByUsername", query = "selectt m from Member m where m.username = :username")

 

select를 selectt로 바꾸고 하니 에러가 뜬다.

 

어노테이션에 등록 되어있기 때문에 미리 파싱해서 sql로 들고있으려고 하는데 문법에 안맞네.ㅋ 오류내야지 이거임

 

대부분의 오류를 다 잡아준다.

 

그렇다고 네임드 쿼리 몇백줄씩 하면 안되겠지?

 

 

============================================================

 

그리고 xml에 정의할 수도 있다.

 

xml이 항상 우선권을 가진다.

 

애플리케이션 운영 환경에 따라 다른 xml을 배포할 수 있다.

 

 

 

뭐 근데...엔티티가 더러워지니까 좀 별로긴해

'Developer' 카테고리의 다른 글

[JPA실전]시작  (0) 2020.09.28
[JPA]벌크연산  (0) 2020.09.23
[JPA]쿼리에 Entity 직접 사용하기  (0) 2020.09.22
[JPA]다형성 JPQL 쿼리  (0) 2020.09.22
[JPA]BatchSize - 전역선언해서 사용하기  (0) 2020.09.22
  Comments,     Trackbacks
[JPA]쿼리에 Entity 직접 사용하기

select count(m) from member m

 

과 select count(m.id) from member m 은 같다.

 

똑같이 select count(m.id) from member m 으로 sql을 박는다.

 

 

 

그리고 파라미터로 엔티티 자체를 줄수도 있다.

 

select m from member m where m=:member

 

쿼리를 이렇게 짜고 .setParameter("member", member)

 

로 파라미터를 주면 이것 은 곧

 

select m from member m where m.id=:memberId

 

와 같다.

 

JPA 엔티티는 DB에 넘어갈때 PK로 넘어가게 된다.

 

당연하지만 흥미롭다.

'Developer' 카테고리의 다른 글

[JPA]벌크연산  (0) 2020.09.23
[JPA]JPQL-Named쿼리  (0) 2020.09.22
[JPA]다형성 JPQL 쿼리  (0) 2020.09.22
[JPA]BatchSize - 전역선언해서 사용하기  (0) 2020.09.22
[JPA]BatchSize - LAZY로딩 시 몇개를 가져올거냐?  (0) 2020.09.22
  Comments,     Trackbacks
[JPA]다형성 JPQL 쿼리

타입을 지정해서 뽑을수 있다.

 

 

 

다운캐스팅 같이 위처럼 사용도 할수 있다.

  Comments,     Trackbacks