Ошибка гибернации только при вызове через JAX-RS - PullRequest
0 голосов
/ 05 марта 2020

Я пытаюсь создать проект, используя Джерси в качестве эталонной реализации JAX-RS и Hibernate в качестве эталонной реализации JPA. Проект разделен на 2 модуля: projectWeb и projectJPA.

В проекте JPA у меня есть древовидные классы: CityServiceTest. java, CityService. java и City. java

В ProjectWeb у меня есть один класс: CityServiceImpl. java

CityServiceTest. java:

import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.TypedQuery;

public class CityServiceTest {
    public static EntityManagerFactory ENTITY_MANAGER_FACTORY = Persistence.createEntityManagerFactory("NepremicnineDM");

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        getCities();
    }

    public static void getCities() {
        EntityManager em = ENTITY_MANAGER_FACTORY.createEntityManager();
        String strQuery = "SELECT c FROM City c WHERE c.id IS NOT NULL";
        TypedQuery<City> tq = em.createQuery(strQuery, City.class);
        List<City> cities = tq.getResultList();
        for(City city : cities) {
            System.out.print(city);
        }
    }
}

Когда я запускаю его как приложение Java, все работает нормально, города выводятся на консоль так: City [id = 1, name = Кабул, cCode = AFG] Город [id = 2, имя = Кандагар, cCode = AFG] Город [id = 3, имя = Герат, cCode = AFG], ...

Проблемы появляются, когда я пытаюсь вызвать класс CityService из projectWeb, из класса CityServiceImpl. Класс CityService очень похож на класс CityServiceTest.

Класс CityService:

import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.TypedQuery;

public class CityService {
    public static EntityManagerFactory ENTITY_MANAGER_FACTORY = Persistence.createEntityManagerFactory("NepremicnineDM");

    public List<City> getCities() {
        EntityManager em = ENTITY_MANAGER_FACTORY.createEntityManager();
        String strQuery = "SELECT c FROM City c WHERE c.id IS NOT NULL";
        TypedQuery<City> tq = em.createQuery(strQuery, City.class);
        List<City> cities = tq.getResultList();
        return cities;
    }
}

Класс CityServiceImpl:

import java.util.List;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import com.NepremicnineJPA.City;
import com.NepremicnineJPA.CityService;

@Path("city")
public class CityServiceImpl {

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public List<City> getApp() {
        CityService cs = new CityService();
        ...

Класс City:

import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
 @Entity
    @Table(name = "city")
    public class City implements Serializable {

        private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "ID", unique = true)
    private int id;
    @Column(name = "Name")
    private String name;
    @Column(name = "CountryCode")
    private String cCode;
    ...

Фрагмент ProjectJPA pom:

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.19</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>5.4.1.Final</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
        <version>5.4.1.Final</version>
    </dependency>* 

Фрагмент ProjectWeb pom:

    <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-servlet-core</artifactId>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.inject</groupId>
        <artifactId>jersey-hk2</artifactId>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-json-binding</artifactId>
    </dependency>        
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.19</version>
    </dependency>

Поэтому, когда я пытаюсь вызвать его через projectWeb, Wildfly выдает мне ошибку:

javax.servlet.ServletException: java .lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: Город не сопоставлен [SELECT c ИЗ города c ГДЕ c .id НЕТ NULL] при развертывании .NepremicnineDM.ear.NepremicnineDMWeb.war // org.glassfi sh .jersey.servlet. .glassfi sh .jersey.servlet.WebComponent.service (WebComponent. java: 346) при развертывании. . java: 366) при развертывании. Непре micnineDM.ear.NepremicnineDMWeb.war // org.glassfi sh .jersey.servlet.ServletContainer.service (ServletContainer. java: 319) при развертывании .NepremicnineDM.ear.NepremicnineDMWeb.war // org.glassfi 1060 .jersey.servlet.ServletContainer.service (ServletContainer. java: 205) на io.undertow. servlet@2.0.27.Final//io.undertow.servlet.handlers.ServletHandler.handleRequest (ServletHandler. java: 74) ...

Может кто-нибудь помочь, пожалуйста меня? PS: я знаю, что на подобные темы отвечали много раз, но я не мог найти ответ, который работал для меня. Спасибо.

Редактировать: постоянство. xml файл

<persistence-unit name="NepremicnineDM" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>

    <class>com.NepremicnineDMJPA.NepremicnineDM.City</class>
    <properties>
        <property name="javax.persistence.jdbc.driver" 
        value="com.mysql.jdbc.Driver"></property>
        <property name="javax.persistence.jdbc.url" 
        value="jdbc:mysql://localhost/world"></property>
        <property name="javax.persistence.jdbc.user" 
        value="root"></property>
        <property name="javax.persistence.jdbc.password" 
        value="root"></property>
    </properties>
</persistence-unit>

1 Ответ

0 голосов
/ 05 марта 2020

Кажется, проблема в том, что у вас нет сопоставлений, определенных для класса City. Просто пометить его как @Entity работает только в том случае, если ваша всеобъемлющая среда настроена на поиск аннотаций в ваших Java классах. Если вы используете что-то вроде Spring Boot для запуска своего приложения, все в порядке. Но если вы просто запускаете его прямо из командной строки, у вас есть много конфигурационного кода, который вам нужно написать, чтобы указать ваше приложение на сущности. В действительно ранних версиях Hibernate это делалось с помощью отдельного файла XML, на который ссылается EntityManager.

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