Я пытаюсь создать проект, используя Джерси в качестве эталонной реализации 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>