2010-08-12 10 views
2

У меня проблема с Hibernate, когда мои объекты домена выполняют чисто аннотацию для Hibernate.Конфигурация аннотации Hibernate с Spring не может найти объект домена

Я получаю

org.hibernate.hql.ast.QuerySyntaxException: User is not mapped [from User u where u.userName=:userName]

Я думал, что все, что должно было быть сделано было добавить packagesToScan свойство для SessionFactory и добавить @Entity к объекту домена. Что еще мне не хватает?

<!-- Hibernate SessionFactory --> 
<bean id="sessionFactory" 
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="packagesToScan" value="com.trx.sample.domain" /> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.dialect">${hibernate.dialect}</prop> 
      <prop key="hibernate.show_sql">${hibernate.show_sql}</prop> 
      <prop key="hibernate.generate_statistics">${hibernate.generate_statistics}</prop> 
     </props> 
    </property> 
    <property name="eventListeners"> 
     <map> 
      <entry key="merge"> 
       <bean 
        class="org.springframework.orm.hibernate3.support.IdTransferringMergeEventListener" /> 
      </entry> 
     </map> 
    </property> 
</bean> 

<context:annotation-config /> 
<tx:annotation-driven /> 

-

package com.trx.sample.domain; 

@Entity 
@Table(name = "user") 
public class User extends BaseEntity implements UserDetails { 

    private static final long serialVersionUID = 1L; 

    @Column(name = "user_name") 
    private String userName; 
    private String password; 
    private boolean enabled; 
    private String roles; 

    ... 
} 

-

@MappedSuperclass 
public class BaseEntity implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue 
    private Long id; 

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

    public Long getId() { 
    return id; 
    } 

    public boolean isNew() { 
    return (this.id == null); 
    } 
} 

-

[INFO] building session factory 
[DEBUG] Session factory constructed with filter configurations : {} 
[DEBUG] instantiating session factory with properties: {...} 
[DEBUG] initializing class SessionFactoryObjectFactory 
[DEBUG] registered: 402881e52a6b3159012a6b3163e40000 (unnamed) 
[INFO] Not binding factory to JNDI, no JNDI name configured 
[DEBUG] instantiated session factory 
[DEBUG] Checking 0 named HQL queries 
[DEBUG] Checking 0 named SQL queries 

Edit:

Не знаю, если это имеет значение или нет, но я запускаю его через eclipse на экземпляре tomcat.

+1

Hibernate довольно многословен, когда она начинается, и это следует отметить каждый класс, как он получает карту. Что он говорит? – skaffman

+0

Это не указывает на то, что оно что-то отображает. – Josh

ответ

1

Повесив голову в стыде, когда я отвечаю на это. Импорт @Entity был неправильным.

Данный объект используется домен

import org.hibernate.annotations.Entity; 

, когда она должна была с помощью

import javax.persistence.Entity; 

Гах!

0

Вы должны установить объекты annotatedClass или packagesToScan в свой SessionFactoryBean. см. Spring documentation

+0

Я делаю это. См. Сообщение. – Josh

+0

Прошу прощения, я этого не видел. Мы используем annotatedClass в нашем приложении и функциональны. Я попытался найти причину, почему packageToScan не нашел классов, но безуспешно. Попробуйте установить уровень отладки для входа в Hibernate или debug Springs AnnotationSessionFactoryBean. Возможно, что Hibernate использует другой classpath. – MarrLiss

1

Только идея: USER - это reserved keyword с некоторыми базами данных, возможно, это предотвращает правильную инициализацию Hibernate. Я предлагаю избежать этого:

package com.trx.sample.domain; 

@Entity 
@Table(name = "`user`") 
public class User extends BaseEntity implements UserDetails { 

    private static final long serialVersionUID = 1L; 

    @Column(name = "user_name") 
    private String userName; 
    private String password; 
    private boolean enabled; 
    private String roles; 

    ... 
} 
+0

Спасибо за мысль. Похоже, это не исправить. Я просто знаю, что это какая-то глупая мелочь, которую я упустил, и я почувствую себя придуркой, когда найду ее. – Josh

+0

@Josh Тогда это что-то еще :) Извините за то, что вы указали очевидное, но не получаете ли какое-либо конкретное сообщение на время создания SessionFactory? Является ли «Пользователь» единственным объектом, который не был распознан? Есть ли у вас другие объекты из того же пакета, которые были правильно распознаны? –

0

Могли ли вы пропустить это?

<property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration"/>

Смежные вопросы