김영한님의 Spring Data JPA 수업 요약
build, execution, ...
> build tools
> gradle
> build and run using
과 그 밑의 설정 IntelliJ IDEA로 변경annotation processors
검색 후 Enable Annotation processing
체크어차피 실습용으로만 쓸테니 간단하게
jdbc:h2:~/datajpa
입력 (DB 파일 생성)jdbc:h2:tcp://localhost/~/datajpa
입력 하고 접속application.yml
spring:
datasource:
url: jdbc:h2:tcp://localhost/~/datajpa
username: sa
password:
driver-class-name: org.h2.Driver
jpa:
hibernate:
ddl-auto: create
properties:
hibernate:
# show_sql: true
format_sql: true
logging.level:
org.hibernate.SQL: debug
# org.hibernate.type: trace
// Member 엔티티
package study.datajpa.entity;
import lombok.Getter;
import lombok.Setter;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
@Getter @Setter
public class Member {
@Id
@GeneratedValue
private Long id;
private String userName;
// JPA 엔티티에는 무조건 NoArgs 생성자가 필요함.
// protected 레벨로 열어놔야지 JPA 기능을 사용하는데 문제가 없음.
protected Member() {
}
public Member(String userName) {
this.userName = userName;
}
}
// Member 레포지토리
package study.datajpa.repository;
import org.springframework.stereotype.Repository;
import study.datajpa.entity.Member;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
@Repository
public class MemberJpaRepository {
@PersistenceContext
private EntityManager em;
public Member save(Member member) {
em.persist(member);
return member;
}
public Member find(Long id) {
return em.find(Member.class, id);
}
}
// 레포지토리 테스트 코드
package study.datajpa.repository;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import study.datajpa.entity.Member;
import javax.transaction.Transactional;
// assertThat 사용하기 위해서 추가해야함.
import static org.assertj.core.api.Assertions.*;
@Transactional
@SpringBootTest
class MemberJpaRepositoryTest {
@Autowired MemberJpaRepository memberJpaRepository;
@Test
public void testMember() {
Member member = new Member("memberA");
Member savedMember = memberJpaRepository.save(member);
Member findMember = memberJpaRepository.find(savedMember.getId());
assertThat(findMember.getId()).isEqualTo(member.getId());
assertThat(findMember.getUserName()).isEqualTo(member.getUserName());
}
}
No EntityManager with actual transaction available for current thread - cannot reliably process 'persist' call; nested exception is javax.persistence.TransactionRequiredException: No EntityManager with actual transaction available for current thread - cannot reliably process 'persist' call