java - 仅当通过 JAX-RS 调用时才出现 Hibernate 错误

标签 java spring hibernate jpa

我正在尝试创建一个项目,使用 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/

相关文章:

java - 我在sql中有数字类型pojo类中对应的映射数据类型是什么

java - 如何使用 Graphics#fillOval 的中心作为引用在中心绘制随机圆

java - 无法将 Spring Boot 应用程序启动到 Linux 服务器

java - 需要连接的 hibernate 路径,但路径已设置

java - Thymeleaf if 表达式不适用于主题参数值

java - JPA Criteria 通过子查询查询 GROUP 和 COUNT

java - 无法加载 com.mchange.v2.resourcepool.BasicResourcePool$1DestroyResourceTask。 java.lang.IllegalStateException

java - 将带有 java envers 的审计表移动到新的数据库实例

java - 如何从 Java 中的字节码生成程序依赖图 (PDG)

Java判断时间是否大于X分钟