基于注解与自动扫描的某些实体没被映射的原因之一

分类:Tech | 作者:Shoopman | 发表于2009/07/16 2条评论 

    在尝试修改基于SpringSide 3.1.3的mini-web过程中,又遇到了一个奇怪的问题。一个hql如下:

StringBuilder hql = new StringBuilder();
hql.append("SELECT new ");
hql.append(CommentBean.class.getName());
hql.append(" (o,u.name,u.image) ");
hql.append(" FROM ");
hql.append(Comment.class.getSimpleName()).append(" o, ");
hql.append(User.class.getSimpleName()).append(" u ");
hql.append(" WHERE o.userId=u.id AND o.infoId=? ");
hql.append(" ORDER BY o.commentTime DESC");

Comment这个实体类的全限定名是:org.shoopman.entity.Comment

但在运行时却报错:

Comment is not mapped [SELECT new org.shoopman.service.dto.CommentBean (o,u.name,u.image)  FROM Comment o, org.shoopman.entity.user.User u  WHERE o.userId=u.id AND o.infoId=?  ORDER BY o.commentTime DESC]
org.hibernate.hql.ast.QuerySyntaxException: Comment is not mapped [SELECT new org.shoopman.service.dto.CommentBean (o,u.name,u.image)  FROM Comment o, org.shoopman.entity.user.User u  WHERE o.userId=u.id AND o.infoId=?  ORDER BY o.commentTime DESC]
        at org.hibernate.hql.ast.util.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.java:181)
        at org.hibernate.hql.ast.tree.FromElementFactory.addFromElement(FromElementFactory.java:110)
        at org.hibernate.hql.ast.tree.FromClause.addFromElement(FromClause.java:93)
        at org.hibernate.hql.ast.HqlSqlWalker.createFromElement(HqlSqlWalker.java:277)

 

而其他实体的查询却没有问题。先看一下spring的applicationContext.xml关于Hibernate的配置:

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="namingStrategy">
        <bean class="org.hibernate.cfg.ImprovedNamingStrategy" />
    </property>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">${hibernate.dialect}</prop>
            <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
            <prop key="hibernate.format_sql">${hibernate.format_sql}</prop>
            <prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider
            </prop>
            <prop key="hibernate.cache.provider_configuration_file_resource_path">${hibernate.ehcache_config_file}</prop>
        </props>
    </property>
    <property name="packagesToScan" value="org.shoopman.entity.*" />
</bean>

    问题就在这个自动描述packagesToScan的配置上。如上的配置,Spring只会扫描到org.shoopman.entity这个包下的子包里的实体类,而直接放在这个包下的实体却没有描述。

    无奈,只好在新建一个org.shoopman.entity.common包,把Comment移到此包下。到此,问题解决。

 

    题外话:看上面的hql生成过程,在使用User这个实体类时,我用的是User.class.getSimpleName(),为什么Hibernate在生成hql却是全限定名。当把Comment移到common包下,控制台里打印出来的hql又是SimpleName。这是Hibernate的一个容错处理吗?

Tag:

日志信息 »

该日志于2009-07-16 14:28由 Shoopman 发表在Tech分类下, 你可以发表评论。除了可以将这个日志以保留源地址及作者的情况下引用到你的网站或博客,还可以通过RSS 2.0订阅这个日志的所有评论。
目前盖楼 (2)层:
  1. yybean 说:

    问题就在这个自动描述packagesToScan的配置上。如上的配置,Spring只会扫描到org.shoopman.entity这个包下的子包里的实体类,而直接放在这个包下的实体却没有描述。

    无奈,只好在新建一个org.shoopman.entity.common包,把Comment移到此包下。到此,问题解

    你把配置改成 这样不就完了

发表评论 »

« »