`

JNDI 报错No Dialect mapping for JDBC type :-9

 
阅读更多

前段时间碰到了这类错误,最后的问号表示不确定的数字,但是解决的方法都一样。

 

首先,自定义一个方言类——Hibernate Dialect,该类需要继承与我们使用的数据库相应的方言类。比如:如果我们用的是MySql(版本为5.x.x),我们需要继承“org.hibernate.dialect.MySQL5Dialect”;如果我们使用的是DB2,那么我们应该继承“org.hibernate.dialect.DB2Dialect”;我用的是SqlServer2008,所以我要继承“org.hibernate.dialect.SQLServerDialect”,参考代码如下:

Java代码 复制代码
  1. import java.sql.Types;   
  2.   
  3. import org.hibernate.Hibernate;   
  4. import org.hibernate.dialect.SQLServerDialect;   
  5.   
  6. public class SqlServer2008Dialect extends SQLServerDialect {   
  7.   
  8.     public SqlServer2008Dialect() {   
  9.         super();   
  10.         registerHibernateType(Types.CHAR, Hibernate.STRING.getName());   
  11.         registerHibernateType(Types.NVARCHAR, Hibernate.STRING.getName());   
  12.         registerHibernateType(Types.LONGNVARCHAR, Hibernate.STRING.getName());   
  13.         registerHibernateType(Types.DECIMAL, Hibernate.DOUBLE.getName());   
  14.     }   
  15. }  
Java代码 复制代码 收藏代码
  1. import java.sql.Types;   
  2.   
  3. import org.hibernate.Hibernate;   
  4. import org.hibernate.dialect.SQLServerDialect;   
  5.   
  6. public class SqlServer2008Dialect extends SQLServerDialect {   
  7.   
  8.     public SqlServer2008Dialect() {   
  9.         super();   
  10.         registerHibernateType(Types.CHAR, Hibernate.STRING.getName());   
  11.         registerHibernateType(Types.NVARCHAR, Hibernate.STRING.getName());   
  12.         registerHibernateType(Types.LONGNVARCHAR, Hibernate.STRING.getName());   
  13.         registerHibernateType(Types.DECIMAL, Hibernate.DOUBLE.getName());   
  14.     }   
  15. }  
import java.sql.Types;

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

public class SqlServer2008Dialect extends SQLServerDialect {

	public SqlServer2008Dialect() {
		super();
		registerHibernateType(Types.CHAR, Hibernate.STRING.getName());
		registerHibernateType(Types.NVARCHAR, Hibernate.STRING.getName());
		registerHibernateType(Types.LONGNVARCHAR, Hibernate.STRING.getName());
		registerHibernateType(Types.DECIMAL, Hibernate.DOUBLE.getName());
	}
}

 

总之大家可以在“org.hibernate.dialect”这个package中找到与数据库相对应的方言类。在其中,我们需要注意三点点:

a、在默认构造方法中继承父类构造方法,同时调用“registerHibernateType(int code, String name)”方法将数据库中该数据类型映射到相应的java类型。code表示数据库中的数据类型整数表示,可以在“java.sql.Types”类中查到相应的数据库类型。name表示我们要映射的java类型。可以从“org.hibernate.Hibernate”中查到。

b、Types类。在Types中定义了数据库常用的字段类型,如:

Java代码 复制代码
  1. ……   
  2. public final static int LONGVARCHAR =  -1;   
  3. public final static int TIMESTAMP =  93;   
  4. ……  
Java代码 复制代码 收藏代码
  1. ……   
  2. public final static int LONGVARCHAR =  -1;   
  3. public final static int TIMESTAMP =  93;   
  4. ……  
……
public final static int LONGVARCHAR =  -1;
public final static int TIMESTAMP =  93;
……

 

我们可以根据“No Dialect mapping for JDBC type : ”后面紧跟的数字在该类(Types)中找到相应的类型。我们也可以根据数据表中字段的类型找到相应的值。这个值就是registerHibernateType(int code, String name)的第一个参数。

c、Hibernate类。Hibernate中定义了转换的目的类型,如第一段代码所示。能够转化成什么类型,可以在该类中查找。通过调用“getName()”方法得到一个String型。当然,如果你记住了,我们还可以这样写

Java代码 复制代码
  1. import org.hibernate.dialect.SQLServerDialect;   
  2.   
  3. public class SqlServer2008Dialect extends SQLServerDialect {   
  4.   
  5.     public SqlServer2008Dialect() {   
  6.         super();   
  7.         registerHibernateType(1"string");   
  8.         registerHibernateType(-9"string");   
  9.         registerHibernateType(-16"string");   
  10.         registerHibernateType(3"double");   
  11.     }   
  12. }  
Java代码 复制代码 收藏代码
  1. import org.hibernate.dialect.SQLServerDialect;   
  2.   
  3. public class SqlServer2008Dialect extends SQLServerDialect {   
  4.   
  5.     public SqlServer2008Dialect() {   
  6.         super();   
  7.         registerHibernateType(1"string");   
  8.         registerHibernateType(-9"string");   
  9.         registerHibernateType(-16"string");   
  10.         registerHibernateType(3"double");   
  11.     }   
  12. }  
import org.hibernate.dialect.SQLServerDialect;

public class SqlServer2008Dialect extends SQLServerDialect {

	public SqlServer2008Dialect() {
		super();
		registerHibernateType(1, "string");
		registerHibernateType(-9, "string");
		registerHibernateType(-16, "string");
		registerHibernateType(3, "double");
	}
}

 

其实和上面是一样的,只是把上面所代表的值直接写出来了。O(∩_∩)O哈哈~。需要注意的是super()方法的调用,不调用该方法是否会出现错误,我这就不知道了,这个我没有做过测试,所以最好调一下。

 

 

然后,我们还需要在配置文件中作修改。我用的是EJB3,所以我在META-INF文件夹下的persistent.xml文件中添加属性“hibernate.dialect”,value值为“xxx.xxx.SqlServer2008Dialect ”,xxx表示包名,这个大家都知道。代码如下:

Java代码 复制代码
  1. <?xml version="1.0" encoding="UTF-8" ?>   
  2. <persistence xmlns="http://java.sun.com/xml/ns/persistence"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xsi:schemaLocation="http://java.sun.com/xml/ns/persistence   
  5.         http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"   
  6.     version="1.0">   
  7.     <persistence-unit name="DateSource">   
  8.         <jta-data-source>java:/SqlServerDS</jta-data-source>   
  9.         <properties>   
  10.             <property name="hibernate.dialect" value="xxx.xxx.SqlServer2008Dialect"/>   
  11.             <property name="hibernate.hbm2ddl.auto" value="none" />   
  12.         </properties>   
  13.     </persistence-unit>   
  14. </persistence>  
Java代码 复制代码 收藏代码
  1. <?xml version="1.0" encoding="UTF-8" ?>   
  2. <persistence xmlns="http://java.sun.com/xml/ns/persistence"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xsi:schemaLocation="http://java.sun.com/xml/ns/persistence   
  5.         http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"   
  6.     version="1.0">   
  7.     <persistence-unit name="DateSource">   
  8.         <jta-data-source>java:/SqlServerDS</jta-data-source>   
  9.         <properties>   
  10.             <property name="hibernate.dialect" value="xxx.xxx.SqlServer2008Dialect"/>   
  11.             <property name="hibernate.hbm2ddl.auto" value="none" />   
  12.         </properties>   
  13.     </persistence-unit>   
  14. </persistence>  
<?xml version="1.0" encoding="UTF-8" ?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
        http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
	version="1.0">
	<persistence-unit name="DateSource">
		<jta-data-source>java:/SqlServerDS</jta-data-source>
		<properties>
			<property name="hibernate.dialect" value="xxx.xxx.SqlServer2008Dialect"/>
			<property name="hibernate.hbm2ddl.auto" value="none" />
		</properties>
	</persistence-unit>
</persistence>

 打包部署,OK!当然,如果你使用的是Hibernate,则修改Hibernate配置文件hibernate.cfg.xml,将“hibernate.dialect”属性的值改为自己的方言类“xxx.xxx.SqlServer2008Dialect ”即可。

分享到:
评论

相关推荐

    spring3.2+strut2+hibernate4

    -- &lt;jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/store" /&gt;--&gt; &lt;!--Hibernate配置--&gt; &lt;bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"&gt;&lt;!...

    spring-boot-reference.pdf

    Mapping Error Pages outside of Spring MVC 27.1.12. Spring HATEOAS 27.1.13. CORS Support 27.2. The “Spring WebFlux Framework” 27.2.1. Spring WebFlux Auto-configuration 27.2.2. ...

    Hibernate_3.2.0_符合Java习惯的关系数据库持久化

    3.8.2. JNDI绑定的SessionFactory 3.8.3. 在JTA环境下使用Current Session context (当前session上下文)管理 3.8.4. JMX部署 4. 持久化类(Persistent Classes) 4.1. 一个简单的POJO例子 4.1.1. 实现一个默认的...

    Manning.Spring.in.Action.4th.Edition.2014.11.epub

    9.5.2. Working with Thymeleaf’s Spring Security dialect 9.6. Summary 3. Spring in the back end Chapter 10. Hitting the database with Spring and JDBC 10.1. Learning Spring’s data-access philosophy ...

    HibernateAPI中文版.chm

    3.8.2. JNDI绑定的SessionFactory 3.8.3. 在JTA环境下使用Current Session context (当前session上下文)管理 3.8.4. JMX部署 4. 持久化类(Persistent Classes) 4.1. 一个简单的POJO例子 4.1.1. 实现一个默认的...

    hibernate3.2中文文档(chm格式)

    3.8.2. JNDI绑定的SessionFactory 3.8.3. 在JTA环境下使用Current Session context (当前session上下文)管理 3.8.4. JMX部署 4. 持久化类(Persistent Classes) 4.1. 一个简单的POJO例子 4.1.1. 实现一个默认的...

    Spring-Reference_zh_CN(Spring中文参考手册)

    13.4. 处理器映射(handler mapping) 13.4.1. BeanNameUrlHandlerMapping 13.4.2. SimpleUrlHandlerMapping 13.4.3. 拦截器(HandlerInterceptor) 13.5. 视图与视图解析 13.5.1. 视图解析器 13.5.2. 视图解析链 ...

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    博客个人文章管理维护功能(7) 博客个人文章分类管理维护功能(8) 博客个人友情链接维护功能(9) 博客个人基本信息管理维护功能(10) 博客图片上传及个人相册管理(11) 网络用户写留言,博主查看留言。 第二章 系统设计 ...

    Hibernate+中文文档

    3.8.2. JNDI绑定的SessionFactory 3.8.3. 在JTA环境下使用Current Session context (当前session上下文)管理 3.8.4. JMX部署 4. 持久化类(Persistent Classes) 4.1. 一个简单的POJO例子 4.1.1. 实现一个默认的...

    spring-framework-reference-4.1.2

    Not Using Commons Logging ................................................................... 12 Using SLF4J ..............................................................................................

    spring-framework-reference4.1.4

    Not Using Commons Logging ................................................................... 12 Using SLF4J ..............................................................................................

    hibernate3.6 文档(pdf 格式)

    3.3. JDBC connections ............................................................................................ 32 3.4. Optional configuration properties ..............................................

Global site tag (gtag.js) - Google Analytics