简体   繁体   中英

JPA Database connection issue

So in school I am working on a RESTFUL-webapi. Until recently I only used 1 repository. Now that we finally have 2+ I changed how we called the EntityManagerFactory etc. I changed it to an abstract class so it could be called from there for every single repository.

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();
    }
}

Now the error I am getting is this one:

The persistence provider is attempting to use properties in the persistence.xml file to resolve the data source. A Java Database Connectivity (JDBC) driver or data source class name must be specified in the openjpa.ConnectionDriverName or javax.persistence.jdbc.driver property. The following properties are available in the configuration: "org.apache.openjpa.jdbc.conf.JDBCConfigurationImpl@dfd7dd11".

I did some googling and most people said it was a connection to the DB problem. However the Entitymanagers worked fine before I put them in an abstract class.

This is my persistence.xml file, located in the correct spot(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>

So I was hoping mayby some of you could enlight me with what I did wrong?

Edit:

Source code for 1 of the repositories: package 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);
    }


}

edit Catalina Logs:

    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

After consulting a teacher about it, this is the solution I came up with. It does kinda change my concept of using the abstract class but it does fix all the issues.

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();
        }
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM