hibernate中类not mapped问题

spring项目中,用到hibernate mapping。后台写完之后junit test可以跑通,数据库可以存取数据,但是页面数据传过来之后,hql报错。已经仔细检查过hql中是查询的是类名还是表名以及各项配置,hpl中查询的是map过的类名。单元测试跑得通,所以xml配置应该也没错。但是页面存取数据的时候会报错。仔细检查过hql的大小写,全半角以及空格是否为中文空格,依然不能解决问题。希望各路高人给指条明路,感激不尽。。

报错内容:[code=text]
Caused by: org.hibernate.hql.ast.QuerySyntaxException: User is not mapped [from User where userName=?]
[/code]

具体的配置如下。

实体类:[code=java]
package com.huatek.cloud.usercenter.entity;

import com.huatek.framework.entity.FwAccount;

public class User extends FwAccount{

private static final long serialVersionUID = 6736542524764495567L;

private String seqNum;                              //数据的序列号,数据库中主键(id)。由于BaseServiceImpl中存在id字段,故重命名

private String userName;                            //用户名字段。如果注册方式为邮箱则它的值为email值;注册方式为手机则值为cellphone值

private String email;                               //用户的邮箱地址字段

private String cellphone;                           //用户的手机号字段

private int regType;                                //用户的注册类型字段

private String password;                            //用户的密码字段

private int activated;                          //用户的“是否激活”字段

private String validateCode;                        //用户的激活码字段

private java.sql.Timestamp registerTime;                            //用户的注册时间字段


//getter、setter方法略

}
[/code]

类与表的映射文件:User.hbm.xml
[code=text]

import 实体类所在的package;

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<class name = "User" table="t_register">

    <id name="seqNum" type="java.lang.String" column="id" length="100"></id>

    <property name="userName" column="name" type="java.lang.String" length="30"></property>

    <property name="email" column="email" type="java.lang.String" length="50"></property>

    <property name="cellphone" column="phone" type="java.lang.String" length="11"></property>

    <property name="regType" column="regType" type="java.lang.Integer" length="1"></property>

    <property name="password" column="password" type="java.lang.String" length="50"></property>

    <property name="activated" column="status" type="java.lang.Integer" length="1"></property>

    <property name="validateCode" column="validateCode" type="java.lang.String" length="100"></property>

    <property name="registerTime" column="registerTime" type="java.sql.Timestamp" length="100"></property>


</class>


[/code]

配置映射文件:application-base.xml
[code=text]
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

    <property name="mappingLocations">
        <list>
            <!-- base frame -->
            <value>classpath*:/com/huatek/framework/hibernate/maps/oracle/*.hbm.xml
            </value>
            <!-- data dictionary -->
            <value>classpath*:/com/huatek/dictionary/hibernate/oracle/*.hbm.xml
            </value>
            <!-- data authority -->
            <value>classpath*:/com/huatek/authority/hibernate/oracle/*.hbm.xml
            </value>
            <!-- cloud authority -->
                <value>classpath*:/com/huatek/cloud/usercenter/hibernate/mysql/*.hbm.xml
            </value>
        </list>
    </property>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">${hibernate.dialect}</prop>
            <prop key="hibernate.show_sql">false</prop>
            <prop key="hibernate.format_sql">true</prop>
            <prop key="hibernate.generate_statistics">false</prop>
            <prop key="hibernate.default_batch_fetch_size">30</prop>
        </props>
    </property>
    <!-- <property name="lobHandler"> <ref local="oracleLobHandler" /> </property> -->
    <property name="eventListeners">
        <map>
            <entry key="merge">
                <bean
                    class="org.springframework.orm.hibernate3.support.IdTransferringMergeEventListener" />
            </entry>
        </map>
    </property>
</bean>

[/code]

服务层中的实现方法,实际是就是判断userName是否已经存在库中以实现判断用户名重复:
[code=java]
@Override
public boolean cmpUserName(int regType, String userName) {

    String hql = "from User where userName=?";
    @SuppressWarnings("unchecked")
    List<User> resultUser = hibernateTemplate.find(hql,userName);  //每次debug单步跟进到这里报错

    if (resultUser.isEmpty())
         return userNameNotDup;
     else
         return userNameDup;
}

[/code]

6个回答

tangruiming
tangruiming 亲,我查询的就是类名不是表名哈,我知道肯定不能查表名啦,问题是单元测试都跑得通,但是页面数据传过来就报错,郁闷
大约 4 年之前 回复

你的User是一个继承类,需要添加继承类的映射。一般可以通过几种方式映射,subclass,joined-subclass,union-subclass。

tangruiming
tangruiming 我是用的别人的框架,担心以后要用到框架里面的东西,所以继承了一下。实际上我没用到框架里实体类相关的东西,打算以后要是有用到再说。刚才把继承关系去除了,还是一样的报错呀。。。
大约 4 年之前 回复

这个问题看似很简单,意思很容易理解说实体没有进行映射。在网上找了很多解决方法说是因为写hql时要对应的实体类的名字而不是表明。但是分析自己的代码应该没问题才是。但是我发现自己注释时 是这样写的,

自己给自己的实体取了个名字,因此我们在写HQL时要用自己所取的名字。果然将hql修改后,程序仅能正常运行。

总结:遇到问题是要具体问题具体解决,网上的解决方式是给自己的一个指引。我们不要一......
答案就在这里:hibernate:XXX is not mapped问题的解决
----------------------你好,人类,我是来自CSDN星球的问答机器人小C,以上是依据我对问题的理解给出的答案,如果解决了你的问题,望采纳。

类和表的映射文件中class标签的nqme属性应该写全类名

tangruiming
tangruiming 你的意思是把绝对路径写完吗?我试了把路径写全,class = "com.xxxx.xxx.xxx.xxx.User",依旧报错呀。。
大约 4 年之前 回复

最悲剧的是,我的东西提交上去,别人荡下来可以跑得通,我把工程彻底从硬盘上删除再荡下来,还是一样的问题。。。user is not mapped..报错位置就是hql

最悲剧的是,我的东西提交上去,别人荡下来可以跑得通,我把工程彻底从硬盘上删除再荡下来,还是一样的问题。。。user is not mapped..报错位置就是hql

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!