https://www.youtube.com/watch?v=egVZusxSeKw&lc=UgwPAg3j8fk07aopqeN4AaABAg
김영한님의 JPA기초강의 수강 중에 생긴 에러 기록
org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
WARN: HHH10001002: Using Hibernate built-in connection pool (not for production use!)
Exception in thread "main" org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]
pom.xml
버전을 콘솔에 나온 5.1.2.Final 로 변경해주니 없어짐
(근데 버전을 이렇게 많이 낮춰야되나...??)
---------수정---------
너무 낮은 버전인 것 같아서 강사님이랑 동일하게 5.3.7.Final로 변경함!!!
에러4 를 해결하고 나니 문제가 없어졌다. 기존의 5.4.31.Final로 다시 수정...!!!
혹시 에러4 내용은 문제 없었는데도 해당 에러가뜨면 버전을 변경해보시길 바랍니당
Caused by: javax.persistence.PersistenceException: Unrecognized persistence.xml version [2.2]
src/main/resources/META-INF/persistence.xml
번역기 돌려보니까 2.2버전을 사용할 수 없다고 해서 2.1로 버전을 변경해주니 해결
Exception in thread "main" java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException
Caused by: java.lang.ClassNotFoundException: javax.xml.bind.JAXBException
pom.xml
pom.xml파일에 javax의 xml bind 종속성 추가하니 완료
4-1) Caused by: java.lang.ClassNotFoundException: Could not load requested class : org.h2.Driver
4-2) Caused by: org.hibernate.boot.registry.classloading.spi.ClassLoadingException: Unable to load class [org.h2.Driver]
4-3) Caused by: org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]
이 하나때문에 이렇게 많은 에러가 발생하였다....ㅠㅠㅠㅠ제일 삽질 오래한 파트인듯
pom.xml
해당 의존성을 추가할 때 mvn repository 페이지에서 dependency를 그대로 복사해왔었다.
→ (https://mvnrepository.com/artifact/com.h2database/h2 접속 후 자신의 h2버전에 맞는 곳에 ㄱㄱ)
나는 maven으로는 파일을 처음 설정해본거라 저 scope의 의미를 잘 몰랐다....
이제야 어림짐작하건데, 해당 com.h2database의존성 파일은 test시에만 사용하겠다는 의미였던 것이 아닐까...^^
pom.xml
이렇게 바꿔주고 나니까 에러가 2개는 없어졌음
Gradle의 경우에는!
testImplementation group: 'com.h2database', name: 'h2', version: '1.4.200' |
홈페이지에 이렇게 되어있는데 testImplementation을 implementation으로 변경해주면 된다.
만약 이렇게 했는데도 안된다면, h2가 설치된 폴더에 가서 해당 h2의 jar파일을 프로젝트 라이브러리에 직접 추가해줘야한다고 한다.
해당 내용은 이 블로거님이 잘 정리해두셨었다 → https://dololak.tistory.com/473
나는 이렇게 안해도 해결됐으니 따로 글 쓰진 않겠음!!
Exception in thread "main" javax.persistence.PersistenceException: No Persistence provider for EntityManager named (이름)
이건 제일 처음부터 발생했던 에러인데, 글 다쓰기 전에 생각나서 추가해봄ㅋㅋㅋㅋ
src/main/java/hellojpa/Main.java
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
메인 함수에서 EntityManagerFactory를 불러와서 create하는 곳이다.
JPA에관해 무지한 상태였기 때문에 해당 코드가 persistence.xml파일과 어떤식으로 작용하는지 하나도 몰랐다.
그래서 저지른 만행
src/main/resources/META-INF/persistence.xml
여기 파일의 <persistence-unit> 부분 끝 name 보이십니까.... 이 이름이랑 main함수의 createEntityManagerFactory() 내의 값과 동일해야하는 것이였다....
그래서 createEntityManagerFactory() 매개변수 값을 persistence-unit의 name값과 동일하게 맞춰주니까 해결되었다!
드디어 에러메시지 없이 System.out.println(); 의 내용을 출력하고나서 EntityManagerFactory가 종료되었다ㅠㅠㅠ감격...
참고하시라고 전체 코드 올립니다.
src/main/resources/META-INF/persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" version="2.1">
<persistence-unit name="test">
<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"/>
<!-- 옵션 -->
<!-- 콘솔에 하이버네이트가 실행하는 SQL문 출력 -->
<property name="hibernate.show_sql" value="true"/>
<!-- SQL 출력 시 보기 쉽게 정렬 -->
<property name="hibernate.format_sql" value="true"/>
<!-- 쿼리 출력 시 주석(comments)도 함께 출력 -->
<property name="hibernate.use_sql_comments" value="true"/>
<!-- JPA 표준에 맞춘 새로운 키 생성 전략 사용 -->
<property name="hibernate.id.new_generator_mappings" value="true"/>
</properties>
</persistence-unit>
</persistence>
pom.xml
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>hellojpa</groupId>
<artifactId>hellojpa</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-entitymanager -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.4.31.Final</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.h2database/h2 -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.200</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.xml.bind/jaxb-api -->
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
</dependencies>
</project>
src/main/java/hellojpa/Main.java
package hellojpa;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
public class Main {
public static void main(String args[]) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("test");
System.out.println("hello");
emf.close();
}
}
[JPA] JPA 어노테이션 활용하여 db에 값 넣기 (0) | 2021.05.20 |
---|