我正在尝试创建一个项目,使用 Jersey 作为 JAX-RS 引用实现,使用 Hibernate 作为 JPA 引用实现。项目分为 2 个模块:projectWeb 和 projectJPA。
在projectJPA中,我有树类: 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 应用程序运行时,一切正常,城市会像这样打印在控制台中: 城市 [id=1,name=喀 boolean ,cCode=AFG]城市 [id=2,name=Qandahar,cCode=AFG]城市 [id=3,name=赫拉特,cCode=AFG],...
当我尝试从 ProjectWeb、CityServiceImpl 类调用 CityService 类时出现问题。 CityService 类与 CityServiceTest 类非常相似。
城市服务类:
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();
...
城市类别:
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: City is not mapped [SELECT c FROM City c WHERE c.id IS NOT NULL] at deployment.NepremicnineDM.ear.NepremicnineDMWeb.war//org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:410) at deployment.NepremicnineDM.ear.NepremicnineDMWeb.war//org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:346) at deployment.NepremicnineDM.ear.NepremicnineDMWeb.war//org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:366) at deployment.NepremicnineDM.ear.NepremicnineDMWeb.war//org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:319) at deployment.NepremicnineDM.ear.NepremicnineDMWeb.war//org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:205) at io.undertow.servlet@2.0.27.Final//io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74) ...
有人可以帮我吗? P.S.:我知道类似的话题已经被回答过很多次了,但我找不到对我有用的答案。谢谢。
编辑:persistence.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>
最佳答案
问题似乎是您没有为 City
类定义任何映射。仅当您将总体框架设置为在 Java 类中查找注释时,才将其标记为 @Entity
才有效。如果您使用 Spring Boot 之类的东西来运行您的应用程序,那就没问题。但是,如果您只是直接从命令行运行它,则需要编写大量配置代码才能将应用程序指向实体。在 Hibernate 的早期版本中,这是通过 EntityManager 引用的单独 XML 文件来完成的。
关于java - 仅当通过 JAX-RS 调用时才出现 Hibernate 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60534825/