`

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 ”即可。

分享到:
评论

相关推荐

    EntityBean配置过程.txt

    - `&lt;type-mapping&gt;`: 表示数据源元数据中的类型映射方式,在本例中使用`Oracle10g`来指定针对Oracle 10g数据库的特定配置。 #### 三、EJB 3.0配置 接下来,我们来看一下如何利用EJB 3.0技术进行持久化层的配置。 ...

    hibernate_reference.pdf

    Hibernate is an Object-Relational Mapping (ORM) solution for Java applications that provides a powerful framework for mapping object-oriented domain models to traditional relational databases....

    Hibernate配置手册.txt

    - `connection.url`:指定数据源或JNDI名称。 - `connection.provider_class`:数据库连接提供者类,这里使用的是`DatasourceConnectionProvider`,表明通过数据源获取连接。 - `dialect`:指定数据库方言,这里...

    Hibernate 课件_配置文件详解

    - **`dialect`**:配置特定数据库的方言,如`org.hibernate.dialect.MySQLDialect`。不同的数据库可能有不同的SQL语法,通过指定正确的方言可以让Hibernate生成适合当前数据库的SQL语句。 - **`hbm2ddl.auto`**:...

    WebLogiceclipseoracle框架搭建使用.docx

    &lt;property name="jndi.class"&gt;weblogic.jndi.WLInitialContextFactory &lt;property name="connection.username"&gt;web &lt;property name="connection.password"&gt;11111111 &lt;property name="dialect"&gt;org.hibernate....

    Hibernate几种连接池的比较

    -- 指定数据源为JNDI名称 --&gt; &lt;property name="connection.datasource"&gt;java:comp/env/jdbc/schoolprojectDS&lt;/property&gt; &lt;!-- 是否将运行期生成的 SQL 输出到日志以供调试--&gt; &lt;property name="show_sql"&gt;true...

    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;!...

    Hibernate 3.x 参考手册

    &lt;property name="dialect"&gt;org.hibernate.dialect.MySQLDialect ``` - **外连接查询** - 控制是否启用外连接查询。 - **二进制流** - 处理 BLOB 类型数据。 - **二级缓存和查询缓存** - 配置缓存策略提高...

    spring学习笔记3

    根据给定的文件信息,我们可以总结出以下几个...&lt;ResourceLink name="jdbc/mydatasource" global="jdbc/mydatasource" type="javax.sql.DataSource"/&gt; ``` **Step 3:** 在Spring的配置文件中引用JNDI名称: ```xml ...

    jsf+spring+hibernate 配置.pdf

    &lt;prop key="hibernate.dialect"&gt;org.hibernate.dialect.MySQL5Dialect &lt;prop key="hibernate.show_sql"&gt;true ``` 这里,`dataSource`引用了之前配置的Proxool数据源,`sessionFactory`配置了实体包扫描...

    Hibernate Developer Guide

    - 使用命令行工具:`java -jar hibernate-tools-X.Y.Z.jar hbm2ddl -db hsqldb -dialect org.hibernate.dialect.HSQLDialect -input hibernate-mapping.hbm.xml` - 通过编程方式调用。 #### 四、事务和并发控制 ...

    hibernate2入门

    - **Web应用环境**:将jar文件放置在WEB-INF/lib目录下,并可以通过JNDI获取JDBC资源。 #### 四、快速入门实例 1. **创建数据库表**:使用SQL语句创建一个简单的USER表,包含用户ID、姓名、性别和年龄等字段。 ``...

    Hibernate.cfg.xml配置总结[借鉴].pdf

    数据源可以是JDBC直接配置,也可以通过JNDI(Java Naming and Directory Interface)来查找。对于JDBC配置,包括了数据库驱动、URL、用户名和密码等属性。例如: ```xml &lt;property name="connection.driver_class"&gt;...

    Hibernate2和Hibernate3连接池配置.doc

    &lt;property name="dialect"&gt;org.hibernate.dialect.MySQLDialect &lt;!-- 映射资源 --&gt; &lt;mapping resource="com/wqbi/model/pojo/student.hbm.xml" /&gt; &lt;/session-factory&gt; &lt;/hibernate-configuration&gt; ``` 这段...

    Hibernate.cfg.xml配置总结

    在Hibernate.cfg.xml中,数据源的配置分为两种方式:JDBC直连和JNDI查找。JDBC直连是直接在配置文件中提供数据库连接的相关信息,如数据库驱动、URL、用户名和密码。而JNDI查找则是通过Java Naming and Directory ...

    hibernate参考文档

    &lt;property name="hibernate.dialect"&gt;org.hibernate.dialect.MySQLDialect &lt;/session-factory&gt; &lt;/hibernate-configuration&gt; ``` - **1.2.4 使用Ant构建** 可以使用Ant工具来自动化构建过程,包括编译代码、...

Global site tag (gtag.js) - Google Analytics