2017-02-23 88 views
2

我正在嘗試使用名爲world的MySQL內置數據庫來學習Hibernate。它有三個表格,分別是城市,國家和國家語言。我想要做的是執行SQL語句SELECT * FROM world.city;。當我運行我的項目時出現錯誤MySQL表未由Hibernate映射5+

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

我正在使用IntelliJ IDEA和Hibernate 5.2.8。

我創建的映射的XML文件是這樣的:

<?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介紹如下:

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

我在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; 
} 
} 

配置文件

創建會話
<?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> 

主要

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(); 
} 
} 

編輯完整的錯誤列表
enter image description here

EDIT 2
javac的結果 enter image description here

+0

你把你的配置文件放在哪裏? –

+0

這是在src文件夾 – Colonder

+0

我的意思是不在任何包或東西,只是在src文件夾,就像它的頂部 – Colonder

回答

1

我做了一些測試ING和我做它通過使用完全合格的類名工作:

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

現在,這是唯一的解決方法不碰你的配置..

更深的挖掘後,我發現,因爲Hibernate 5.x版本,構建sessionFactory有一個不同的策略。

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

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

return configuration.buildSessionFactory(serviceRegistry); 

這與這裏舉例說明:jboss documentation(點2.4)

0

由於馬切伊的答案,我設法其他人的幫助下

我通過實現SessionFactory的如下作出您的示例工作讓我的例子通過修改代碼並將其清理一點來工作。我還發現用xml文件映射數據庫是過時的,所以我修改了正確的CityEntity類。最終代碼:

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

​​