Проблема подключения к базе данных JPA - PullRequest
0 голосов
/ 07 мая 2018

Итак, в школе я работаю над RESTFUL-webapi. До недавнего времени я использовал только 1 хранилище. Теперь, когда у нас наконец есть 2+, я изменил способ, которым мы назвали EntityManagerFactory и т. Д. Я изменил его на абстрактный класс, чтобы его можно было вызывать оттуда для каждого отдельного хранилища.

public abstract class EntityController {

    protected static EntityManagerFactory entityManagerFactory = null;
    protected static EntityManager entityManager = null;
    protected static EntityTransaction entityTransaction = null;

    public void entityStart(){
        entityManagerFactory = Persistence.createEntityManagerFactory("research");
        entityManager = entityManagerFactory.createEntityManager();
        entityTransaction = entityManager.getTransaction();

        entityTransaction.begin();
    }

    public void entityCommitAndClose(Boolean doCommit){
        if (doCommit){
            entityTransaction.commit();
        }
        entityManager.close();
        entityManagerFactory.close();
    }
}

Теперь я получаю следующую ошибку:

Поставщик сохраняемости пытается использовать свойства в файле persistence.xml для разрешения источника данных. Драйвер Java Database Connectivity (JDBC) или имя класса источника данных должны быть указаны в свойстве openjpa.ConnectionDriverName или javax.persistence.jdbc.driver. В конфигурации доступны следующие свойства: "org.apache.openjpa.jdbc.conf.JDBCConfigurationImpl@dfd7dd11".

Я немного погуглил, и большинство людей сказали, что это связано с проблемой БД. Однако менеджеры Entity работали хорошо, прежде чем я поместил их в абстрактный класс.

Это мой файл persistence.xml, расположенный в правильном месте (resources / meta-inf)

<?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="research" transaction-type="RESOURCE_LOCAL">
        <properties>
            <!-- JPA    standard    -->
            <property   name="javax.persistence.jdbc.driver"    value="com.mysql.jdbc.Driver"   />
            <property   name="javax.persistence.jdbc.url"   value="jdbc:mysql://localhost/groepswerk"   />
            <property   name="javax.persistence.jdbc.user"  value="root"    />
            <property   name="javax.persistence.jdbc.password"  value=""    />
            <property   name="javax.persistence.schema-generation.database.action"  value="create"  /> <!--drop-and-create-->
            <property name="openjpa.MetaDataRepository" value="Preload=true" />
            <!-- Hibernate  specific    -->
            <property   name="hibernate.show_sql"    value="true"/>
            <property   name="hibernate.xxx"    value="xxx"/>
        </properties>
    </persistence-unit>
</persistence>

Так что я надеялся, что некоторые из вас могут осветить меня тем, что я сделал неправильно?

Edit:

Исходный код 1 из репозиториев: пакет app.repositories;

import app.models.Student;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import javax.persistence.*;
import java.util.List;

public class StudentRepository extends EntityController implements IStudentRepository {
    final static Logger LOGGER = LogManager.getLogger(ExamRepository.class);

    // to get a student by name
    @Override
    public Student getStudentByNumber(String number) {
        try {
            entityStart();
            TypedQuery<Student> query = entityManager.createQuery("SELECT s FROM Student as s WHERE s.studentNumber=?1", Student.class);
            query.setParameter(1, number);

            return query.getSingleResult();
        } catch (IllegalArgumentException exception){
            LOGGER.error(exception);
        } finally {
            entityCommitAndClose(false);
        }

        return null;
    }

    // to get a list of all students
    @Override
    public List<Student> getAllStudents() {
        try {
            entityStart();
            TypedQuery<Student> query = entityManager.createQuery("SELECT s FROM Student as s", Student.class);

            return query.getResultList();
        } catch (IllegalArgumentException exception){
            LOGGER.error(exception);
        } finally {
            entityCommitAndClose(false);
        }

        return null;
    }

    // if student logs in, a student gets created
    @Override
    public void createStudent(Student student) {
        entityStart();

        Student newStudent = new Student(student);
        entityManager.persist(newStudent);

        entityCommitAndClose(true);
    }

    @Override
    public void changeDownloadStatus(Student user, Boolean status){
        entityStart();
        Student student = entityManager.find(Student.class, user.getId());

        student.setDownloaded(status);

        entityCommitAndClose(true);
    }

    @Override
    public void changeUploadStatus(Student user, Boolean status){
        entityStart();
        Student student = entityManager.find(Student.class, user.getId());

        student.setUploaded(status);

        entityCommitAndClose(true);
    }


}

редактировать Каталина Логи:

    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:80)
    at org.apache.tomee.catalina.OpenEJBSecurityListener$RequestCapturer.invoke(OpenEJBSecurityListener.java:97)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:650)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:799)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1457)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.NullPointerException
    at app.repositories.EntityController.entityCommitAndClose(EntityController.java:26)
    at app.repositories.StudentRepository.getAllStudents(StudentRepository.java:42)
    at app.services.StudentService.getAllStudents(StudentService.java:16)
    at app.controllers.StudentController.getAllStudents(StudentController.java:17)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.openejb.server.cxf.rs.PojoInvoker.performInvocation(PojoInvoker.java:43)
    at org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:96)
    ... 38 more

    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:80)
    at org.apache.tomee.catalina.OpenEJBSecurityListener$RequestCapturer.invoke(OpenEJBSecurityListener.java:97)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:650)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:799)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1457)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.NullPointerException
    at app.repositories.EntityController.entityCommitAndClose(EntityController.java:26)
    at app.repositories.StudentRepository.getAllStudents(StudentRepository.java:42)
    at app.services.StudentService.getAllStudents(StudentService.java:16)
    at app.controllers.StudentController.getAllStudents(StudentController.java:17)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.openejb.server.cxf.rs.PojoInvoker.performInvocation(PojoInvoker.java:43)
    at org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:96)
    ... 38 more

07-May-2018 14:46:12.347 SEVERE [http-nio-8080-exec-10] org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMessage Error occurred during error handling, give up!
 org.apache.cxf.interceptor.Fault
    at org.apache.cxf.service.invoker.AbstractInvoker.createFault(AbstractInvoker.java:162)
    at org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:128)
    at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:191)
    at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:101)
    at org.apache.openejb.server.cxf.rs.AutoJAXRSInvoker.invoke(AutoJAXRSInvoker.java:68)
    at org.apache.cxf.interceptor.ServiceInvokerInterceptor$1.run(ServiceInvokerInterceptor.java:59)
    at org.apache.cxf.interceptor.ServiceInvokerInterceptor.handleMessage(ServiceInvokerInterceptor.java:96)
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308)
    at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)
    at org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:267)
    at org.apache.openejb.server.cxf.rs.CxfRsHttpListener.doInvoke(CxfRsHttpListener.java:253)
    at org.apache.tomee.webservices.CXFJAXRSFilter.doFilter(CXFJAXRSFilter.java:94)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.catalina.filters.CorsFilter.handleNonCORS(CorsFilter.java:423)
    at org.apache.catalina.filters.CorsFilter.doFilter(CorsFilter.java:169)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
    at org.apache.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:44)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:80)
    at org.apache.tomee.catalina.OpenEJBSecurityListener$RequestCapturer.invoke(OpenEJBSecurityListener.java:97)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:650)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:799)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1457)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.NullPointerException
    at app.repositories.EntityController.entityCommitAndClose(EntityController.java:26)
    at app.repositories.StudentRepository.getAllStudents(StudentRepository.java:42)
    at app.services.StudentService.getAllStudents(StudentService.java:16)
    at app.controllers.StudentController.getAllStudents(StudentController.java:17)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.openejb.server.cxf.rs.PojoInvoker.performInvocation(PojoInvoker.java:43)
    at org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:96)
    ... 38 more

1 Ответ

0 голосов
/ 13 мая 2018

После консультации с учителем об этом я и решил. Это как бы меняет мою концепцию использования абстрактного класса, но исправляет все проблемы.

public class EntityController {

    private static EntityManagerFactory entityManagerFactory = null;

    static {
        entityManagerFactory = Persistence.createEntityManagerFactory("research");
    }

    public static EntityManager getEntityManager(){
        return entityManagerFactory.createEntityManager();
    }

    public static void startTransaction(EntityManager entityManager){
        entityManager.getTransaction().begin();
    }


    public static void finishTransaction(EntityManager entityManager){
        if (entityManager.isOpen()){
            EntityTransaction entityTransaction = entityManager.getTransaction();
            if (entityTransaction.isActive()) {
                entityManager.getTransaction().commit();
            }
            entityManager.close();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...