0
votes

I am trying to create a project using Jersey as a JAX-RS Reference Implementation and Hibernate as a JPA Reference Implementation. Project is separated in 2 modules, projectWeb and projectJPA.

In projectJPA, I have tree classes: CityServiceTest.java, CityService.java and City.java

In projectWeb I have one class: 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);
        }
    }
}

When I run it as Java application, everything works fine, cities get printed in console like that: City [id=1, name=Kabul, cCode=AFG]City [id=2, name=Qandahar, cCode=AFG]City [id=3, name=Herat, cCode=AFG],...

Problems appear when I try to invoke CityService class from projectWeb, from CityServiceImpl class. CityService class is very simillar to CityServiceTest class.

CityService class:

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 class:

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 class:

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 snippet:

    <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 snippet:

    <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>

So when I try to invoke it via projectWeb, Wildfly gives me an error:

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 [email protected]//io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74) ...

Can anyone please help me? P.S.: I know simillar topics were answered many times, but I couldnt quite find the answer that worked for me. Thanks.

Edit: persistence.xml file

<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

1 Answers

0
votes

The problem seems to be that you don't have any mappings defined for the City class. Just tagging it as @Entity only works if you're overarching framework is set to look for annotations in your Java classes. If you're using something like Spring Boot to run your app, you're fine. But if you're just running it straight from the command line, you have a lot of config code you need to write to point your application to the entities. In really early versions of Hibernate, this was done via a separate XML file referenced by the EntityManager.