六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 34|回复: 0

Hibernate3.2.5: No Dialect mapping for JDBC type: -1问题

[复制链接]

升级  54.33%

111

主题

111

主题

111

主题

举人

Rank: 3Rank: 3

积分
363
 楼主| 发表于 2013-2-3 14:41:12 | 显示全部楼层 |阅读模式
我的环境是:SQL Server2005 + Hibernate3.2.5

报错如下:

org.hibernate.MappingException: No Dialect mapping for JDBC type: -1
     at org.hibernate.dialect.TypeNames.get(TypeNames.java:56)
     at org.hibernate.dialect.TypeNames.get(TypeNames.java:81)
     at org.hibernate.dialect.Dialect.getHibernateTypeName(Dialect.java:370)
     at org.hibernate.loader.custom.CustomLoader$Metadata.getHibernateType(CustomLoader.java:559)
     at org.hibernate.loader.custom.CustomLoader$ScalarResultColumnProcessor.performDiscovery(CustomLoader.java:485)
     at org.hibernate.loader.custom.CustomLoader.autoDiscoverTypes(CustomLoader.java:501)
     at org.hibernate.loader.Loader.getResultSet(Loader.java:1796)
     at org.hibernate.loader.Loader.doQuery(Loader.java:674)
     at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
     at org.hibernate.loader.Loader.doList(Loader.java:2220)
     at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104)
     at org.hibernate.loader.Loader.list(Loader.java:2099)
     at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:289)
     at org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1695)
     at org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:142)
     at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:152)
     at org.apache.jsp.jsp.ad.do_.download_005fquestionnaire_jsp._jspService(download_005fquestionnaire_jsp.java:104)
     at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
     at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:393)
     at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
     at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
     at com.ibm.crl.inkfish.filters.UserManageFilter.doFilter(UserManageFilter.java:98)
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
     at com.ibm.crl.inkfish.filters.EncodingFilter.doFilter(EncodingFilter.java:31)
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
     at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
     at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:263)
     at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
     at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:584)
     at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
     at java.lang.Thread.run(Unknown Source)

问题原因:

数据库表中有text类型的字段,而Hibernate在native查询中没有注册这个字段,因此发生这个错误。

解决方法:

写一个类、修改hibernate配置文件。 写一个Dialect的子类,这里我 extends SQLServerDialectt类:

package com.zy.util;

import java.sql.Types;

import org.hibernate.Hibernate;
import org.hibernate.dialect.SQLServerDialect;

public class DialectForInkfish extends SQLServerDialect {
public DialectForInkfish() {
   super();
   //registerHibernateType(Types.LONGVARCHAR, 65535, "text");//.LONGVARCHAR
   registerHibernateType(Types.DECIMAL, Hibernate.BIG_DECIMAL.getName());  
        registerHibernateType(-1, Hibernate.STRING.getName());
}

}

修改Hibernate配置文件hibernate.cfg.xml,把

<property name="dialect">  
   org.hibernate.dialect.SQLServerDialect
</property>

修改成:

<property name="dialect">  
   com.zy.util.DialectForInkfish
</property>

说明: 如果你的数据库是mysql,而又用了decimal类型,报错应该是 No Dialect mapping for JDBC type: 3 . 注意这个3, 它说明hibernate不能将这种数据类型映射到你的java类中. 就需要在自定义的方言中用到:

registerHibernateType(Types.DECIMAL, Hibernate.BIG_DECIMAL.getName());
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表