1. 类文件信息节选,为了表现的简明一点,特意把与该问题无关的信息删除了。/**
* @hibernate.class
* table="COMM_USER_INFO"
* dynamic-insert="true"
* dynamic-update="true"
* lazy="false"
* batch-size="5"
* @hibernate.query
* name="getCountUserByUserId"
* query="SELECT COUNT(*) FROM User user WHERE user.userId = :userId"
*/
public class User extends BaseObject {
private String id; // 用户 ID 号
private String userId; // 用户名
private String password; // 用户密码 /**
* 获取属性 <TT>id</TT> 的值,用户逻辑 ID 号。
* @return 返回属性 <TT>id</TT> 的值。
* @hibernate.id
* type="java.lang.String"
* length="32"
* column="ID"
* unsaved-value="null"
* generator-class="uuid.hex"
*/
public String getId() {
return id;
} /**
* 设置属性 <TT>id</TT> 的值。
* @param id 设置为属性 <TT>id</TT> 的值。
*/
public void setId(String id) {
this.id = id;
}
/**
* 获取属性 <TT>userId</TT> 的值。
* @return 返回属性 <TT>userId</TT> 的值。
* @hibernate.property
* type="java.lang.String"
* length="32"
* not-null="true"
* column="USER_ID"
* unique="true"
* index="UNI_IDX_USER_USERID"
*/
public String getUserId() {
return userId;
} /**
* 设置属性 <TT>userId</TT> 的值。
* @param userId 设置为属性 <TT>userId</TT> 的值。
*/
public void setUserId(String userId) {
this.userId = userId;
}
}2. ANT 中脚本节选(xdoclet.classpath使用为 xdoclet2 中的类和包)
<target name="generator-mapping" description="生成Mapping文件">
<taskdef name="xdoclet" classname="org.xdoclet.ant.XDocletTask" classpathref="xdoclet.classpath"></taskdef>
<echo message="生成Mapping文件..."></echo>
<xdoclet>
<fileset dir="${basedir}/src">
<include name="dao/com/test/model/*.java"/>
</fileset>
<component classname="org.xdoclet.plugin.hibernate.HibernateMappingPlugin"
destdir="${basedir}/src/dao" version="3.0" encoding="UTF-8" force="true"/>
</xdoclet>
</target>3. 生成后的 .hbm 映射文件
...
<hibernate-mapping>
<class dynamic-update="true" optimistic-lock="version" lazy="false" table="COMM_USER_INFO" batch-size="5" dynamic-insert="true" name="com.test.model.User">
<comment>用户基本信息表</comment>
<id unsaved-value="null" name="id" column="ID" type="java.lang.String" length="32">
<generator class="uuid.hex"/>
</id>
<property name="userId" column="USER_ID" length="32" unique="true" not-null="true" type="java.lang.String"></property> <query name="getCountUserByUserId"><![CDATA[SELECT COUNT(*) FROM User user WHERE user.userId = :userId]]></query>
</class>
</hibernate-mapping>4.问题详情:
大家一定注意到,这个映射文件中的 <query ...> ... </query> 信息被包含在 <class ...> ... </class> 标签里面,也正是因为这样,在程序中调用以下语句时,会报出后面的异常信息。调用语句:
dao.setObject(new User());
Map<String, String> paras = new HashMap<String, String>();
paras.put(User.USER_ID, userId);
Long count = (Long) dao.queryUniqueObject("getCountUserByUserId", paras);
return count.longValue() == 0 ? false : true;程序异常信息:
org.hibernate.MappingException: Named query not known: getCountUserByUserId
at org.hibernate.impl.AbstractSessionImpl.getNamedQuery(AbstractSessionImpl.java:70)
at org.hibernate.impl.SessionImpl.getNamedQuery(SessionImpl.java:1260)
at com.test.persistence.hibernate.HibernateGeneralDAO.queryUniqueObject(HibernateGeneralDAO.java:533)
at com.test.service.impl.UserManagerImpl.isUserExist(UserManagerImpl.java:159)
at com.test.service.impl.UserManagerImpl.save(UserManagerImpl.java:42)
at com.test.service.impl.UserManagerImpl$$FastClassByCGLIB$$f2e552fc.invoke(<generated>)
at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:191)
...其他信息省略不写。
5.调试结果:
如果把映射文件中的 <query ...> ... </query> 信息放到 <class ...> ... </class> 标签外面,则程序回复正常。如以下所示:
<hibernate-mapping>
<class dynamic-update="true" optimistic-lock="version" lazy="false" table="COMM_USER_INFO" batch-size="5" dynamic-insert="true" name="com.test.model.User">
<comment>用户基本信息表</comment>
<id unsaved-value="null" name="id" column="ID" type="java.lang.String" length="32">
<generator class="uuid.hex"/>
</id>
<property name="userId" column="USER_ID" length="32" unique="true" not-null="true" type="java.lang.String"></property>
</class>
<query name="getCountUserByUserId"><![CDATA[SELECT COUNT(*) FROM User user WHERE user.userId = :userId]]></query>
</hibernate-mapping>6.问在最后:
很显然,是 xdoclet 编译问题,请问各位大哥大姐我的 ANT 配置文件是不是写得有问题?我该不该进行适当修改呢?
各位大侠,有遇到过这样的问题吗?如果有如何解决呢,谢谢了!
* @hibernate.class
* table="COMM_USER_INFO"
* dynamic-insert="true"
* dynamic-update="true"
* lazy="false"
* batch-size="5"
* @hibernate.query
* name="getCountUserByUserId"
* query="SELECT COUNT(*) FROM User user WHERE user.userId = :userId"
*/
public class User extends BaseObject {
private String id; // 用户 ID 号
private String userId; // 用户名
private String password; // 用户密码 /**
* 获取属性 <TT>id</TT> 的值,用户逻辑 ID 号。
* @return 返回属性 <TT>id</TT> 的值。
* @hibernate.id
* type="java.lang.String"
* length="32"
* column="ID"
* unsaved-value="null"
* generator-class="uuid.hex"
*/
public String getId() {
return id;
} /**
* 设置属性 <TT>id</TT> 的值。
* @param id 设置为属性 <TT>id</TT> 的值。
*/
public void setId(String id) {
this.id = id;
}
/**
* 获取属性 <TT>userId</TT> 的值。
* @return 返回属性 <TT>userId</TT> 的值。
* @hibernate.property
* type="java.lang.String"
* length="32"
* not-null="true"
* column="USER_ID"
* unique="true"
* index="UNI_IDX_USER_USERID"
*/
public String getUserId() {
return userId;
} /**
* 设置属性 <TT>userId</TT> 的值。
* @param userId 设置为属性 <TT>userId</TT> 的值。
*/
public void setUserId(String userId) {
this.userId = userId;
}
}2. ANT 中脚本节选(xdoclet.classpath使用为 xdoclet2 中的类和包)
<target name="generator-mapping" description="生成Mapping文件">
<taskdef name="xdoclet" classname="org.xdoclet.ant.XDocletTask" classpathref="xdoclet.classpath"></taskdef>
<echo message="生成Mapping文件..."></echo>
<xdoclet>
<fileset dir="${basedir}/src">
<include name="dao/com/test/model/*.java"/>
</fileset>
<component classname="org.xdoclet.plugin.hibernate.HibernateMappingPlugin"
destdir="${basedir}/src/dao" version="3.0" encoding="UTF-8" force="true"/>
</xdoclet>
</target>3. 生成后的 .hbm 映射文件
...
<hibernate-mapping>
<class dynamic-update="true" optimistic-lock="version" lazy="false" table="COMM_USER_INFO" batch-size="5" dynamic-insert="true" name="com.test.model.User">
<comment>用户基本信息表</comment>
<id unsaved-value="null" name="id" column="ID" type="java.lang.String" length="32">
<generator class="uuid.hex"/>
</id>
<property name="userId" column="USER_ID" length="32" unique="true" not-null="true" type="java.lang.String"></property> <query name="getCountUserByUserId"><![CDATA[SELECT COUNT(*) FROM User user WHERE user.userId = :userId]]></query>
</class>
</hibernate-mapping>4.问题详情:
大家一定注意到,这个映射文件中的 <query ...> ... </query> 信息被包含在 <class ...> ... </class> 标签里面,也正是因为这样,在程序中调用以下语句时,会报出后面的异常信息。调用语句:
dao.setObject(new User());
Map<String, String> paras = new HashMap<String, String>();
paras.put(User.USER_ID, userId);
Long count = (Long) dao.queryUniqueObject("getCountUserByUserId", paras);
return count.longValue() == 0 ? false : true;程序异常信息:
org.hibernate.MappingException: Named query not known: getCountUserByUserId
at org.hibernate.impl.AbstractSessionImpl.getNamedQuery(AbstractSessionImpl.java:70)
at org.hibernate.impl.SessionImpl.getNamedQuery(SessionImpl.java:1260)
at com.test.persistence.hibernate.HibernateGeneralDAO.queryUniqueObject(HibernateGeneralDAO.java:533)
at com.test.service.impl.UserManagerImpl.isUserExist(UserManagerImpl.java:159)
at com.test.service.impl.UserManagerImpl.save(UserManagerImpl.java:42)
at com.test.service.impl.UserManagerImpl$$FastClassByCGLIB$$f2e552fc.invoke(<generated>)
at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:191)
...其他信息省略不写。
5.调试结果:
如果把映射文件中的 <query ...> ... </query> 信息放到 <class ...> ... </class> 标签外面,则程序回复正常。如以下所示:
<hibernate-mapping>
<class dynamic-update="true" optimistic-lock="version" lazy="false" table="COMM_USER_INFO" batch-size="5" dynamic-insert="true" name="com.test.model.User">
<comment>用户基本信息表</comment>
<id unsaved-value="null" name="id" column="ID" type="java.lang.String" length="32">
<generator class="uuid.hex"/>
</id>
<property name="userId" column="USER_ID" length="32" unique="true" not-null="true" type="java.lang.String"></property>
</class>
<query name="getCountUserByUserId"><![CDATA[SELECT COUNT(*) FROM User user WHERE user.userId = :userId]]></query>
</hibernate-mapping>6.问在最后:
很显然,是 xdoclet 编译问题,请问各位大哥大姐我的 ANT 配置文件是不是写得有问题?我该不该进行适当修改呢?
各位大侠,有遇到过这样的问题吗?如果有如何解决呢,谢谢了!
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货