Hibernate не может найти сопоставления классов для только что созданных таблиц

У меня есть спящий режим, создающий мою схему базы данных для меня. Он может прекрасно создавать таблицы, но именованные запросы не компилируются, потому что он утверждает, что объекты не сопоставлены.

Все приложение управляется аннотациями и настройками: .xml файлов нет.

Вот соответствующие части конфигурации:

properties = new Properties();
properties.setProperty("hibernate.connection.driver_class", "org.postgresql.Driver");
properties.setProperty("hibernate.connection.url", con);
properties.setProperty("hibernate.connection.username", user);
properties.setProperty("hibernate.connection.password", pass);
properties.setProperty("hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect");
properties.setProperty("hibernate.current_session_context_class","thread");
properties.setProperty("hibernate.hbm2ddl.auto","create");

Configuration config = new Configuration();
config.setProperties(properties);
config.addAnnotatedClass(Player.class);
SessionFactory factory = config.buildSessionFactory();

Мой класс проигрывателя сейчас довольно простой — у него есть некоторые параметры, такие как имя и идентификатор. Он с радостью переводит их в правильную таблицу.

@Entity
@NamedQueries({
    @NamedQuery(name="verifyPlayerByUuid", query="SELECT name FROM player WHERE uuid = :uuid"),
    @NamedQuery(name="verifyPlayerByName", query="SELECT name FROM player WHERE name = :name"),
    @NamedQuery(name="obtainPlayerByUuid", query="FROM player WHERE uuid = :uuid"),
})
public class Player {
    // impl here
}

Когда я запускаю его, я получаю это. Обратите внимание, что я обрезал стандартную метку времени и имена пакетов гибернации, чтобы освободить место для соответствующих сообщений. Я также позволил себе отформатировать сообщение, чтобы лучше упорядочить данные — это включало только добавление пробелов.

[timestamp] [hib].hbm2ddl.SchemaExport   - HHH000227: Running hbm2ddl schema export
[timestamp] [hib].hbm2ddl.SchemaExport   - HHH000230: Schema export complete

[timestamp] [hib].SessionFactoryImpl     - HHH000177: Error in named query: verifyPlayerByUuid
org.hibernate.hql.internal.ast.QuerySyntaxException: 
    player is not mapped [SELECT name FROM player WHERE uuid = :uuid]

[timestamp] [hib].SessionFactoryImpl     - HHH000177: Error in named query: obtainPlayerByUuid
org.hibernate.hql.internal.ast.QuerySyntaxException: 
    player is not mapped [FROM player WHERE uuid = :uuid]

[timestamp] [hib].SessionFactoryImpl     - HHH000177: Error in named query: verifyPlayerByName
org.hibernate.hql.internal.ast.QuerySyntaxException: 
    player is not mapped [SELECT name FROM player WHERE name = :name]

person corsiKa    schedule 01.11.2013    source источник


Ответы (1)


Вам нужно использовать имя класса, который является сопоставленным объектом

config.addAnnotatedClass(Player.class);
...
FROM Player WHERE uuid = :uuid

Точно так же uuid должно быть полем этого класса.

person Sotirios Delimanolis    schedule 01.11.2013
comment
так что HQL чувствителен к регистру? - person corsiKa; 02.11.2013
comment
@corsiKa Да, очень даже. В противном случае рефлексия не сработала бы. - person Sotirios Delimanolis; 02.11.2013
comment
@corsiKa Также может иметь значение: stackoverflow.com /вопросы/5327682/ - person Sotirios Delimanolis; 02.11.2013