开发者

Hibernate annotation configuration with Spring can't find domain object

开发者 https://www.devze.com 2023-01-11 12:20 出处:网络
I am having a problem with Hibernate seeing my domain objects doing a purely annotation configuration for Hibernate.

I am having a problem with Hibernate seeing my domain objects doing a purely annotation configuration for Hibernate.

I'm getting

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

I thought all that had to be done was add the packagesToScan property for the sessionFactory and add @Entity to the domain object. What else am I missing?

<!-- 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 serialVersionU开发者_如何学编程ID = 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:

Don't know if it makes a difference or not but I'm running it through eclipse on a tomcat instance.


Just an idea: USER is a reserved keyword with some databases, maybe this is preventing Hibernate from being properly initialized. I suggest escaping it:

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;

  ...
}


Hanging my head in shame as I answer this. The @Entity import was incorrect.

This particular domain object used

import org.hibernate.annotations.Entity;

when it should have been using

import javax.persistence.Entity;

gah!


You have to set annotatedClass or packagesToScan properties in your SessionFactoryBean. see Spring documentation


Could yo be missing this?

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

0

精彩评论

暂无评论...
验证码 换一张
取 消