Ошибка «java.lang.ClassNotFoundException: javax.persistence.Persistence» в спящем JPA-проекте на основе MVC - PullRequest
0 голосов
/ 10 декабря 2018

Я пытаюсь создать веб-приложение на основе структуры MVC и Hibernate JPA.

Я хочу сохранить форму данных в базе данных.для этой работы я получаю данные в servlet и вызываю метод в personManager классе в business logic "bl" пакете.

этот метод больше всего получает данные и сохраняет их, но представляет эту ошибку:

10-Dec-2018 11:15:07.463 SEVERE [http-nio-8080-exec-5] org.apache.catalina.core.StandardWrapperValve.invoke Servlet.service() for servlet [manager] in context with path [] threw exception [Servlet execution threw an exception] with root cause
java.lang.ClassNotFoundException: javax.persistence.Persistence
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1309)
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1137)
at util.JPAProvider.<clinit>(JPAProvider.java:13)
at model.bl.PersonManager.<init>(PersonManager.java:24)
at controller.Manager.service(Manager.java:81)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
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.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:493)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
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:800)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:806)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1498)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Unknown Source)

класс сервлета:

  public void service (HttpServletRequest request , HttpServletResponse response)throws IOException, ServletException
{
    String username= request.getParameter("choose-username");
    String password= request.getParameter("choose-password");
    String repeatPass= request.getParameter("repeat-password");
    String email = request.getParameter("email");
    HttpSession session = request.getSession();

     try {
            PersonManager personManager = new PersonManager();
            personManager.addUser(username , password , email , "female");
            response.sendRedirect("/views/welcome.jsp");
        } catch (Exception e)
        {
            request.getRequestDispatcher("/views/register.jsp").forward(request, response);
        }
    }

Класс JPAProvider:

public class JPAProvider {

private static final EntityManagerFactory entityManagerFactory;//instate of session for connect to database
static{
    entityManagerFactory  = Persistence.createEntityManagerFactory("MyConnection");
}

public static EntityManagerFactory getEntityManagerFactory() {
    return entityManagerFactory;
}

}

открытый класс PersonManager {

EntityManager entityManager=null;
EntityTransaction entityTransaction=null;

public PersonManager() {
     entityManager = JPAProvider.getEntityManagerFactory().createEntityManager();//session factory
     entityTransaction = entityManager.getTransaction();
}

public Boolean addUser(String username , String password , String email , String sex)
{
    try{
        entityTransaction.begin();
        Person person = new Person();
        person.setUsername(username);
        person.setPassword(password);
        person.setEmail(email);
        person.setSex(sex);
        entityManager.persist(person);
        entityTransaction.commit();
        entityManager.close();

    }catch (Exception e){
        System.out.println(e.getStackTrace());
        System.out.println("addUser failed");
    }
    return true;
}

}

Класс:

package model.entity;
import model.bl.PersonManager;
import javax.persistence.*;
import java.io.Serializable;
import java.util.List;

//mapping class to table
@Entity (name = "person")
@Table(name = "USERS")
@EntityListeners(value = PersonManager.class)

public class Person implements Serializable
{

@Id // create id and fill auto by sequence in database
@Column(name="UID" ,columnDefinition = "NUMBER" )
@SequenceGenerator(name = "mySeq" , sequenceName = "DB_MYSEQ")
@GeneratedValue(strategy=GenerationType.AUTO ,generator="mySeq")
private long uId;


@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "FK_PERSON",referencedColumnName = "UID")
private List<Pictures> picturesList;


@Basic
@Column (name = "USERNAME" , columnDefinition = "NVARCHAR2(30)" , nullable = false , unique = true)
private String username ;

@Basic
@Column (name = "USER_PASSWORD" , columnDefinition = "NVARCHAR2(32)" , nullable = false , unique = true)
private String  password ;

@Basic
@Column (name = "EMAIL" , columnDefinition = "NVARCHAR2(40)" , nullable = false)
private String email;


@Basic
@Column (name = "SEX" , columnDefinition = "NVARCHAR2(20)")
private String sex ;

//--------------------------------------------------------

public Person() { }

public Person(String username, String password, String email, String sex, String userPic) {
    this.username = username;
    this.password = password;
    this.email = email;
    this.sex = sex;
    this.userPic = userPic;
}
public Person(String username, String password, String email ,String sex, String userPic,List<Pictures> picturesList ) {
    this.picturesList = picturesList;
    this.sex = sex;
    this.userPic = userPic;
    this.email = email;
    this.password = password;
    this.username = username;
}

//--------------------------------------------------------

public void setUsername(String username) {
    this.username = username;
}

public void setPassword(String password) {
    this.password = password;
}

public void setEmail(String email) {
    this.email = email;
}

public void setUserPic(String userPic) {
    this.userPic = userPic;
}

public void setSex(String sex) {
    this.sex = sex;
}

public void setuId(long uId) {this.uId = uId;}

//--------------------------------------------------------

public String getUsername() {
    return username;
}

public String getPassword() {
    return password;
}

public String getUserPic() {
    return userPic;
}

public String getEmail() {
    return email;
}

public String getSex() {
    return sex;
}

public long getuId() {return uId;}

}
}

persistence.xml:

<persistence-unit name="MyConnection" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <properties>

        <!--<property name="hibernate.transaction.flush_before_completion" value="true"/>-->
        <!--<property name="hibernate.format_sql" value="true"/>-->

        <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect"/>
        <property name="hibernate.connection.driver_class" value="oracle.jdbc.driver.OracleDriver"/>
        <property name="hibernate.connection.username" value="midas"/>
        <property name="hibernate.connection.password" value="midas123"/>
        <property name="hibernate.connection.url" value="jdbc:oracle:thin:@localhost:1521:orcl"/>
        <!--<property name="hibernate.hbm2ddl.auto" value="create-drop"/>-->
        <property name="show_sql" value="true"></property>
       <!-- <property name="hibernate.globally_quoted_identifiers" value="true"/>-->
    </properties>
</persistence-unit>

В некоторых случаях говорили, что проблема была в потере javax.persistence.jar,Я добавляю новые javax.persistence.jar в мои библиотеки, но проблема не была решена.

Я использую:

tomcat 8 JDK 1.8.0-172 oracle 11g IntellyJ Idea

Iиспользуются следующие библиотеки:

1) hibernate-enverc-4.2.0.final

2) hibernate-jpa-2.0-api-1.0.1-final.jar

3) библиотека tomcat

Структура проекта:

src -> controller -> Manager.java

src -> модель -> bl -> personManager.java

src -> entity -> person.java

src -> util -> JPAProvider.java

src -> META-INF --> persistence.xml

web -> views -> ...

web -> WEB-INF -> lib

web -> WEB-INF -> web.xml

Как я могу исправить эту ошибку?

1 Ответ

0 голосов
/ 10 декабря 2018

Он должен находиться не в корне проекта, а непосредственно в исходной папке.

Во время выполнения файл persistence.xml ищется в пути к классам в META-INF.Поэтому, если вы хотите, чтобы папка META-INF размещалась в верхней части дерева скомпилированного пакета, вам нужно поместить ее в верхнюю часть дерева исходного кода.Eclipse копирует каждый не-Java-файл в свой выходной каталог (по умолчанию bin) с учетом иерархии пакетов / папок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...