(완료)
해당 경로에서 ./h2.sh
로 실행
groupId: jpa-basic
artifactId: ex1-hello-jpa
version: 1.0.0
JPA 설정할 때 META-INF 디렉토리 만들어서 그 안에 persistence.xml 파일 생성해주기
<dependencies>
<!-- JPA 하이버네이트 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.3.10.Final</version>
</dependency>
<!-- H2 데이터베이스 -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.199</version>
</dependency>
</dependencies>
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.2"
xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd">
<persistence-unit name="hello">
<properties>
<!-- 필수 속성 -->
<property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
<property name="javax.persistence.jdbc.user" value="sa"/>
<property name="javax.persistence.jdbc.password" value=""/>
<property name="javax.persistence.jdbc.url" value="jdbc:h2:tcp://localhost/~/test"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
<!-- 옵션 -->
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
<property name="hibernate.use_sql_comments" value="true"/>
<!--<property name="hibernate.hbm2ddl.auto" value="create" />-->
</properties>
</persistence-unit>
</persistence>
📌 게시판을 보니 내가 깔아놓은 버전은 오류가 난다고 해서 H2 데이터베이스 버전을 1.4.200 → 1.4.199로 재다운로드함.
아,, 뭐야,,콱,,;
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>jpa-basic</groupId> <artifactId>ex1-hello-jpa</artifactId> <version>1.0.0</version> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>8</source> <target>8</target> </configuration> </plugin> </plugins> </build> <dependencies> <!-- JPA 하이버네이트 --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> <version>5.3.10.Final</version> </dependency> <!-- H2 데이터베이스 --> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <version>1.4.199</version> </dependency> </dependencies> </project>
📌 다행히도 build 태그 내용들을 추가해 다시 실행하니 해결
참고
테이블 생성
❌ 문제!! exit code0이 아닌 1로 뜸 → 뭔가 잘못됨
아래와 같이 해결 방법을 알아봄저는 안돼도 다른 분들은 내가 안 된 방법으로 해결된 경우도 있으니 참고하세요.
⬇️ 참고
1. 안됨
<configuration>
<source>11</source>
<target>11</target>
</configuration>
(일단 저는 안되네요,, 어떡하냐,, 콱,,
해결 방법을 아시는 분은 제발 알려주세요.
일단 실습은 안되는대로 따라하면서 강의 듣겠습니다.)
해결했습니다 😎
위 방법 다 써보고 적용해서 재실행하고 안돼서 껐다 켜서 다시 해봤는데 갑자기 되네요,,^ ^;;,,
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
Member member = new Member();
member.setId(1L);
member.setName("HelloA");
em.persist(member);
tx.commit();
em.close();
emf.close();
try {
Member findMember = em.find(Member.class, 1L);
em.remove(findMember);
tx.commit();
} catch (Exception e) {
tx.rollback();
} finally {
em.close();
}
try {
Member findMember = em.find(Member.class, 1L);
findMember.setName("HelloJPA");
tx.commit();
} catch (Exception e) {
tx.rollback();
} finally {
em.close();
}
JPA를 통해서 엔티티를 가져오면 JPA가 관리를 함. 변경이 됐는지 안됐는지 트렌젝션을 커밋하는 시점에 관리를 해줌. 뭔가 바뀌었다? 싶으면 업데이트 쿼리를 만들어서 날려줌. 그 덕에 우리는 저장하는 코드 없이도 값만 변경해놓고 수정된 결과를 확인할 수 있었음.
@Entity
: JPA가 관리할 객체
@Id
: 데이터베이스 PK와 매핑
📌
- 엔티티 매니저 팩토리는 하나만 생성해 애플리케이션 전체에서 공유
- 엔티티 매니저는 쓰레드간 공유 X(사용하고 버리기)
- JPA의 모든 데이터 변경은 트랜젝션 안에서 실행
: 가장 단순한 조회 방법
a.getB().getC()
)JPA를 사용하면 엔티티 객체를 중심으로 개발
(문제는 검색 쿼리인데) 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색
모든 DB 데이터를 객체로 변환해 검색하는 것은 불가능
애플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 포함된 SQL이 필요
JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어를 제공
SQL과 문법 유사, SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN 지원
JPQL은 엔티티 객체를 대상으로 쿼리
SQL은 데이터베이스 테이블을 대상으로 쿼리
한마디로, JPQL은 테이블이 아닌 객체를 대상으로 검색하는 객체 지향 쿼리이다.
SQL을 추상화하여 특정 데이터베이스 SQL에 의존하지 않는다.
➡️ 객체 지향 SQL