Colonder
Colonder

Reputation: 1576

MySQL table not mapped by Hibernate 5+

I'm trying to learn Hibernate using MySQL built-in database named world. It has three tables called city, country and countrylanguage. What I'm trying to do is execute SQL statement SELECT * FROM world.city;. When I run my project I'm getting error

org.hibernate.hql.internal.ast.QuerySyntaxException: City is not mapped [from City]

I'm using IntelliJ IDEA and Hibernate 5.2.8.

I created mapping xml file like this:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="pl.hibernatePackage">

<class name="City" table="city">

    <id name="id" column="ID" type="int">
        <generator class="native"/>
    </id>
    <property name="name" column="Name" type="string"/>
    <property name="countryCode" column="CountryCode" type="string"/>
    <property name="district" column="District" type="string"/>
    <property name="population" column="Population" type="int"/>

</class>

</hibernate-mapping>

City.java is presented below:

public class City
{
private Integer id;
private String name;
private String countryCode;
private String district;
private Integer population;

public Integer getId() {
    return id;
}

public void setId(Integer id) {
    this.id = id;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getCountryCode() {
    return countryCode;
}

public void setCountryCode(String countryCode) {
    this.countryCode = countryCode;
}

public String getDistrict() {
    return district;
}

public void setDistrict(String district) {
    this.district = district;
}

public Integer getPopulation() {
    return population;
}

public void setPopulation(Integer population) {
    this.population = population;
}
}

I'm creating session in HibernateUtil.java

public class HibernateUtil
{
private static final SessionFactory sessionFactory = buildSessionFactory();

private static SessionFactory buildSessionFactory() {
    try {
        Configuration configuration = new Configuration();
        configuration.configure();

        StandardServiceRegistryBuilder standardServiceRegistryBuilder = new StandardServiceRegistryBuilder();
        standardServiceRegistryBuilder.applySettings(configuration.getProperties());
        ServiceRegistry serviceRegistry = standardServiceRegistryBuilder.build();

        return configuration.buildSessionFactory(serviceRegistry);
    }
    catch(Exception e) {
        throw new ExceptionInInitializerError(e);
    }
}

public static SessionFactory getSessionFactory() {
    return sessionFactory;
}
}

Configuration file

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration SYSTEM
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
<session-factory>
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/world</property>
    <property name="hibernate.connection.username">test</property>
    <property name="hibernate.connection.password">1234</property>
    <property name="connection.pool_size">1</property>
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    <property name="current_session_context_class">thread</property>
    <property name="show_sql">false</property>
    <property name="hbm2ddl.auto">update</property>

    <!-- List of XML mapping files -->
    <mapping resource="pl/hibernatePackage/City.hbm.xml"/>

</session-factory>
</hibernate-configuration>

Main

public class Main
{
public static void main(String[] args)
{
    Session session = HibernateUtil.getSessionFactory().getCurrentSession();
    session.beginTransaction();

    List<City> cities = session.createQuery("from City").list();

    for(City c : cities) {
        System.out.println(c.getId() + "\t" + c.getName() + "\t" + c.getCountryCode() + "\t" + c.getDistrict() +
                "\t" + c.getPopulation());
    }

    session.getTransaction().commit();

    HibernateUtil.getSessionFactory().close();
}
}

EDIT Full error list
enter image description here

EDIT 2
javac result enter image description here

Upvotes: 2

Views: 860

Answers (2)

Colonder
Colonder

Reputation: 1576

Thanks to Maciej's answer and help of other guys I managed to get my example to work by modifying code and cleaning it up a little. I also found out that mapping DB with xml file is outdated so I modifiied properly CityEntity class. Final code:

Main.java

import org.hibernate.Session;
import java.util.List;

public class Main
{
public static void main(String[] args)
{
    Session session = HibernateUtil.getSession();
    session.beginTransaction();

    List<CityEntity> cities = session.createQuery("from CityEntity").list();

    for(CityEntity c : cities)
    {
        System.out.println(c.getId() + "\t" + c.getName() + "\t" + c.getCountryCode() + "\t" + c.getDistrict() +
                "\t" + c.getPopulation());
    }

    session.getTransaction().commit();

    HibernateUtil.close();
}
}

hibernate.cfg.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration SYSTEM
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
<session-factory>
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/world</property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.connection.password">1234</property>
    <property name="connection.pool_size">1</property>
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    <property name="show_sql">true</property>
    <property name="hbm2ddl.auto">update</property>

    <!-- List of mapped classes -->
    <mapping class="CityEntity"/>

</session-factory>
</hibernate-configuration>

HibernateUtil.java

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;

public class HibernateUtil
{
private static final SessionFactory sessionFactory = buildSessionFactory();

private static SessionFactory buildSessionFactory() {
    try {
        Configuration configuration = new Configuration();
        configuration.configure();

        StandardServiceRegistry standardRegistry = new StandardServiceRegistryBuilder()
                .configure()
                .build();

        return configuration.buildSessionFactory(standardRegistry);
    }
    catch(Exception e) {
        throw new ExceptionInInitializerError(e);
    }
}

public static Session getSession()
{
    return sessionFactory.openSession();
}

public static void close()
{
    sessionFactory.close();
}
}

CityEntity.java

import javax.persistence.*;

@Entity
@Table(name = "city", schema = "world")
public class CityEntity
{
private int id;
private String name;
private String countryCode;
private String district;
private int population;

@Basic
@Column(name = "CountryCode")
public String getCountryCode() {
    return countryCode;
}

public void setCountryCode(String countryCode) {
    this.countryCode = countryCode;
}

@Id
@Column(name = "ID")
public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

@Basic
@Column(name = "Name")
public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

@Basic
@Column(name = "District")
public String getDistrict() {
    return district;
}

public void setDistrict(String district) {
    this.district = district;
}

@Basic
@Column(name = "Population")
public int getPopulation() {
    return population;
}

public void setPopulation(int population) {
    this.population = population;
}
}

Upvotes: 0

Maciej Kowalski
Maciej Kowalski

Reputation: 26562

I have done some testing and i made it work by using the fully qualified class name:

session.createQuery("from pl.hibernatePackage.City")

Now this is only a workaround without touching your config..

After digging deeper i found out that since hibernate version 5.x, there is a different strategy for building the sessionFactory.

I made your example work by implementing sessionFactory as follows:

StandardServiceRegistry standardRegistry = new StandardServiceRegistryBuilder()
    .configure()
    .build();

Metadata metadata = new MetadataSources( standardRegistry )
   .getMetadataBuilder()
   .build();

return configuration.buildSessionFactory(serviceRegistry);

This is explained with example here: jboss documentation (point 2.4)

Upvotes: 2

Related Questions