2017-12-12 38 views
0

안녕하세요, 저는 Javaee, JPA를 사용하여 첫 번째 심각한 웹 응용 프로그램을 만드는 중입니다./Hibernate, MySQL, Maven 및 IntelliJ. SessionFactory를 사용할 때 모든 것은 괜찮 았지만 대신 EntityManager를 사용하기로 결정했습니다. 하루 종일 버그를 고치려고했지만이 문제를 해결할 수는 없습니다.요청한 서비스를 만들 수 없습니다. (EntityManager를 사용하려고 시도합니다)

새 행을 추가하려고 할 때 오류가 있습니다 또한 IntelliJ에 콘솔에서

javax.persistence.PersistenceException: Unable to build entity manager factory 
org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:66) 
javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:55) 
javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:39) 
domain.CarDAO.<init>(CarDAO.java:8) 
controller.CarToDbServlet.doPost(CarToDbServlet.java:17) 

와 : 내 웹 애플리케이션을 통해 데이터베이스에

public class CarDAO { 

    private EntityManagerFactory emf = Persistence.createEntityManagerFactory("JPAPersistUnit"); 

    private List<Car> carList = new ArrayList<>(); 

    public void addCar(Car car) { 
     EntityManager em = emf.createEntityManager(); 
     EntityTransaction trans = em.getTransaction(); 

     try { 
      trans.begin(); 
      em.persist(car); 
      trans.commit(); 
     } catch (Exception ex) { 
      if(trans != null) {trans.rollback();} 
      ex.printStackTrace(); 
     } finally { 
      em.close(); 
     } 
    } 
:

Caused by: org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] 

Caused by: org.hibernate.exception.JDBCConnectionException: Error calling DriverManager#getConnection 

Caused by: java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost:3306/carent?useSSL=false&serverTimezone=UTC 

이 내 CarDAO 클래스입니다

<?xml version="1.0" encoding="UTF-8"?> 
<persistence 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_1.xsd" version="2.1"> 

    <persistence-unit name="JPAPersistUnit" transaction-type="RESOURCE_LOCAL"> 
     <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> 
     <class>domain.Car</class> 
     <class>domain.Customer</class> 
     <class>domain.Orders</class> 
     <properties> 
      <property name="javax.persistence.jdbc.Driver" value="com.mysql.jdbc.Driver"/> 
      <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/carent?useSSL=false&amp;serverTimezone=UTC"/> 
      <property name="javax.persistence.jdbc.user" value="root"/> 
      <property name="javax.persistence.jdbc.password" value="root"/> 

      <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/> 
      <property name="hibernate.hbm2ddl.auto" value="create"/> 
      <property name="hibernate.format_sql" value="true"/> 
     </properties> 

    </persistence-unit> 
</persistence> 

이는 pom.xml 파일 내 의존성은 다음과 같습니다 :

이것은 persistence.xml 파일입니다

<dependencies> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>4.12</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-core</artifactId> 
     <version>5.2.12.Final</version> 
     <scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>mysql</groupId> 
     <artifactId>mysql-connector-java</artifactId> 
     <version>6.0.6</version> 
    </dependency> 
    <dependency> 
     <groupId>javax.servlet</groupId> 
     <artifactId>javax.servlet-api</artifactId> 
     <version>4.0.0</version> 
    </dependency> 
    <dependency> 
     <groupId>org.hibernate.javax.persistence</groupId> 
     <artifactId>hibernate-jpa-2.1-api</artifactId> 
     <version>1.0.0.Final</version> 
     <scope>provided</scope> 
    </dependency> 
    </dependencies> 

내가 여기 솔루션을 찾고 있었다, 나는 몇 가지 유사한 주제를 찾았지만 따라 그들에게는 모든 것이 제 코드로 괜찮은 것 같습니다. 어쩌면 이것이 IntelliJ의 문제일까요? 이 제이보스 뭔가

org.dom4j.DocumentFactory cannot be cast to org.dom4j.DocumentFactory

가 :하지만 난이 오류가 ... 내가 최대 절전 모드 코어의 제공 범위를 삭제하는 경우 및 최대 절전 모드에서 JPA를 문제없이 내 DB와 연결되는 데이터 소스를 추가?

:(

+0

배치에'org.dom4j.DocumentFactory'가있는 라이브러리가 포함 된 것처럼 보입니다. 또한 수동으로 컨테이너를 생성하는 대신 컨테이너로 관리되는'EntityManager'를 사용할 것을 제안합니다. –

답변

1

Caused by: java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost:3306/carent?useSSL=false&serverTimezone=UTC

는 JDBC 드라이버와 일치하지 않는 JDBC 드라이버 나 JDBC 드라이버 URL이 누락으로 인한이 예외. SO eerify javax.persistence.jdbc.url 도움 클래스 경로에 드라이버 항아리를 포함하십시오.

업데이트 :. 기본 종속성 범위 컴파일이이며이 범위는 응용 프로그램을 컴파일하고 실행하기위한 JAR을해야한다는 것을 의미

.

제공됨은 컴파일 할 때 JAR이 필요하다는 것을 의미하지만 런타임에는 container 또는 jdk가 종속성을 제공해야합니다. 따라서 이러한 아티팩트는 애플리케이션 내에 패키지화 할 필요가 없습니다.

전 이적 종속성 범위를 확인하려면 maven dependency scope documentation을 참조하십시오. 종속성 트리를 통해 종속성 범위를 확인할 수 있습니다.

mvn dependency:tree 

[INFO] +- org.hibernate:hibernate-core:jar:5.2.12.Final:provided 
[INFO] | +- org.jboss.logging:jboss-logging:jar:3.3.0.Final:provided 
[INFO] | +- org.javassist:javassist:jar:3.20.0-GA:provided 
[INFO] | +- antlr:antlr:jar:2.7.7:provided 
[INFO] | +- org.jboss.spec.javax.transaction:jboss-transaction-api_1.2_spec:jar:1.0.1.Final:provided 
[INFO] | +- org.jboss:jandex:jar:2.0.3.Final:provided 
[INFO] | +- com.fasterxml:classmate:jar:1.3.0:provided 
[INFO] | +- dom4j:dom4j:jar:1.6.1:provided 
[INFO] | \- org.hibernate.common:hibernate-commons-annotations:jar:5.0.1.Final:provided 

문제가 발생한 경우 dom4j 라이브러리를 사용하십시오. 그 범위가 어디에서오고 있는지 확인하고 필요한 범위를 확인 및 설정해야하며 전이 의존성을 제외해야합니다.

<dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-core</artifactId> 
    <version>5.2.12.Final</version> 
    <exclusions> 
     <exclusion> 
      <groupId>dom4j</groupId> 
      <artifactId>dom4j</artifactId> 
     </exclusion> 
    </exclusions> 
</dependency> 
+0

하지만 모든 것을 점검하고 IntelliJ를 통해 DB에 대한 연결을 테스트 할 때 모든 것이 괜찮다고 생각합니다. 나는 모든 필수 종속성을 가지고 있고 SessionFactory와의 연결도 괜찮았다 ...이 의존성으로부터 제공된 scope를 삭제할 때 dom4j에서 오류가 발생한다. (내 메시지의 끝에 언급했듯이) ... 어떤 아이디어? – domrycz

+0

@domrycz 업데이트 답변 hth. – nayakam

0

문제가 해결되었습니다. 종속성 중 일부는 wildfly에서 제공하므로 dependencyManagement 태그와 org.jboss.spec - jboss-javaee-7.0 종속성을 제공하고 제공된 일부 종속성을 제공합니다 (최대 절전 모드). 그리고 더 중요한 것은 - 내 서블릿에 이라는 단어가있는 새 개체 (DAO의)를 만드는 대신 종속성 주입을 사용하기 시작했습니다.

답변에 감사드립니다.