【问题标题】:Hibernate annotation configuration with Spring can't find domain object使用 Spring 的 Hibernate 注释配置找不到域对象
【发布时间】:2011-03-28 22:59:06
【问题描述】:

我在 Hibernate 看到我的域对象为 Hibernate 进行纯粹的注释配置时遇到问题。

我来了

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

我认为只需为 sessionFactory 添加packagesToScan 属性并将@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

编辑:

不知道它是否有区别,但我正在通过 eclipse 在 tomcat 实例上运行它。

【问题讨论】:

  • Hibernate 在启动时非常冗长,它应该在映射时提及每个类。它说什么?
  • 它并不表示它正在映射任何东西。

标签: hibernate spring orm configuration annotations


【解决方案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;

  ...
}

【讨论】:

  • 感谢您的想法。不过好像没修。我只知道这是我忽略的一些愚蠢的小东西,一旦找到它就会觉得自己像个白痴。
  • @Josh 然后是另外一回事 :) 很抱歉说明了这一点,但您在SessionFactory 创建时间没有收到任何特定消息吗? User 是唯一未能被识别的实体吗?您是否有来自同一包的其他实体被正确识别?
【解决方案2】:

当我回答这个问题时,我羞愧地低下了头。 @Entity 导入不正确。

使用了这个特定的域对象

import org.hibernate.annotations.Entity;

应该在什么时候使用

import javax.persistence.Entity;

啊!

【讨论】:

    【解决方案3】:

    您必须在 SessionFactoryBean 中设置 annotatedClass 或 packagesToScan 属性。见Spring documentation

    【讨论】:

    • 我正在这样做。见帖子。
    • 对不起,我没看到。我们在我们的应用程序中使用 annotatedClass 并且它是功能性的。我试图寻找 packageToScan 没有找到类但没有成功的原因。尝试设置调试级别以登录 Hibernate 或调试 Springs AnnotationSessionFactoryBean。 Hibernate 有可能使用其他类路径。
    【解决方案4】:

    你会错过这个吗?

    &lt;property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration"/&gt;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-20
      • 2018-10-25
      • 1970-01-01
      • 2012-08-07
      • 2014-03-29
      • 2012-02-16
      • 1970-01-01
      • 2011-11-01
      相关资源
      最近更新 更多