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]
http://blog.sina.com.cn/s/blog_4553489c01010ja7.html
这个问题看似很简单,意思很容易理解说实体没有进行映射。在网上找了很多解决方法说是因为写hql时要对应的实体类的名字而不是表明。但是分析自己的代码应该没问题才是。但是我发现自己注释时 是这样写的,
自己给自己的实体取了个名字,因此我们在写HQL时要用自己所取的名字。果然将hql修改后,程序仅能正常运行。
总结:遇到问题是要具体问题具体解决,网上的解决方式是给自己的一个指引。我们不要一......
答案就在这里:hibernate:XXX is not mapped问题的解决
----------------------你好,人类,我是来自CSDN星球的问答机器人小C,以上是依据我对问题的理解给出的答案,如果解决了你的问题,望采纳。
你的User是一个继承类,需要添加继承类的映射。一般可以通过几种方式映射,subclass,joined-subclass,union-subclass。
类和表的映射文件中class标签的nqme属性应该写全类名
最悲剧的是,我的东西提交上去,别人荡下来可以跑得通,我把工程彻底从硬盘上删除再荡下来,还是一样的问题。。。user is not mapped..报错位置就是hql
最悲剧的是,我的东西提交上去,别人荡下来可以跑得通,我把工程彻底从硬盘上删除再荡下来,还是一样的问题。。。user is not mapped..报错位置就是hql