簡體   English   中英

僅在通過 JAX-RS 調用時發生休眠錯誤

[英]Hibernate error only when invoking via JAX-RS

我正在嘗試使用 Jersey 作為 JAX-RS 參考實現和 Hibernate 作為 JPA 參考實現創建一個項目。 項目分為 2 個模塊,projectWeb 和 projectJPA。

在 projectJPA 中,我有樹類:CityServiceTest.java、CityService.java 和 City.java

在 projectWeb 我有一個類:CityServiceImpl.java

城市服務測試.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=Kabul, cCode=AFG]City [id=2, name=Qandahar, cCode=AFG]City [ id=3,名稱=赫拉特,cCode=AFG],...

當我嘗試從 CityServiceImpl 類中的 projectWeb 調用 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: 在部署時未映射城市 [SELECT c FROM City c WHERE c.id IS NOT NULL]。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) 在部署.NepremicnineDM.ear.NepremicnineDMWeb.war//org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:366) 在部署.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) ...

誰能幫幫我嗎? PS:我知道類似的主題已經回答了很多次,但我找不到對我有用的答案。 謝謝。

編輯: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類定義任何映射。 僅將其標記為@Entity僅在您將總體框架設置為在 Java 類中查找注釋時才有效。 如果您使用 Spring Boot 之類的東西來運行您的應用程序,那沒問題。 但是,如果您只是直接從命令行運行它,那么您需要編寫大量配置代碼來將您的應用程序指向實體。 在 Hibernate 的早期版本中,這是通過EntityManager引用的單獨 XML 文件完成的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM