前段时间碰到了这类错误,最后的问号表示不确定的数字,但是解决的方法都一样。
首先,自定义一个方言类——Hibernate Dialect,该类需要继承与我们使用的数据库相应的方言类。比如:如果我们用的是MySql(版本为5.x.x),我们需要继承“org.hibernate.dialect.MySQL5Dialect”;如果我们使用的是DB2,那么我们应该继承“org.hibernate.dialect.DB2Dialect”;我用的是SqlServer2008,所以我要继承“org.hibernate.dialect.SQLServerDialect”,参考代码如下:
- 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());
- }
- }
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中定义了数据库常用的字段类型,如:
- ……
-
public final static int LONGVARCHAR = -1;
-
public final static int TIMESTAMP = 93;
- ……
……
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型。当然,如果你记住了,我们还可以这样写
- 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");
- }
- }
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表示包名,这个大家都知道。代码如下:
- <?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:
-
http:
-
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>
<?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 ”即可。
分享到:
相关推荐
hibernate转换编码配置和权限及java代码,请大家共享.
springMVC+hibernate+mybatis整合框架搭建Demo...
hibernate和java类型转换,hibernate和java类型转换
NULL 博文链接:https://json20080301.iteye.com/blog/1292613
hibernate将本地SQL查询结果封装成对象(最终).zip
Hibernate 实体状态 瞬态(transient) 持久化(persistent) 脱管(detached) 转换
自己查资料做出来的小东西,虽然简单,但是能很好的诠释Struts2、Hibernate、jquery、ajax和json的最基本的用法
NULL 博文链接:https://fangguanhong.iteye.com/blog/1731641
这是一个讲解了关于hibernate三种状态之间的转换,如果想知道他们之间的相关总结和理解,这是一个不错的选择
高级Hibernate4开发技术:ORM思想,hibernate介绍,hibernate.cfg.xml配置,hbm.xml映射文件详解,主键生成策略使用,PO对象状态及状态的转换分析、一级缓存,Hibernate数据检索技术,Hibernate高级映射技术,...
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库 Hibernate最初级的操作,使用SchemaExport创建数据表 本资源自带...
Hibernate是开始做暑假的比赛项目之前学的第一门新技术(花了半天啃了大半本书),可惜最后项目用的是JPA。Hibernate是现在企业运用的最主流持久层中间件技术,恩,貌似可以这么说吧。 和JDBC比较一下,同样都是...
hibernate3.3已经转成chm格式....
4.可以选择表,hibernate 主键策略; 5.可以设置生成的 javaBean 的 package 路径; 6.可选择生成的文件保存路径; 7.数据库服务器信息可保存,编辑,删除; 8.支持数据库 mysql5,oracle10g,mssql200,mssql2005...
Hibernate的目标是对于开发者通常的数据持久化相关的编程任务,解放其中的95%。对于以数据为中心的程序来说,它们往往只在数据库中使用存储过程来实现商业逻辑,Hibernate可能不是最好的解决方案;对于那些在基于Java的...
Hibernate3.jar hibernate核心包 antlr-2.7.6.jar 一个语言转换工具(Hibernate利用它实现 HQL 到 SQL 的转换模板相关操作需要包) c3p0-0.9.1.jar c3p0数据源实现的jar文件 cglib.jar CGLIB 字节码解释器 commons-...
掌握Hibernate的基本功能和基本用法 通过Hibernate将一个Java对象插入到数据库表中 (1) Hibernate是一个面向Java环境的对象/关系数据库映射工具,Hibernate不仅管理Java类型到数据库表的映射,还提供查询数据和...
菜单window -> preference -> Java -> Build Path -> User Librarys,分别建立名为Hibernate2,hibernate3,mysql-jdbc的用户库,分别包含对应的lib文件(如hibernate2包含hibernate-2.1目录下的hibernate2.jar及其lib...
Hibernate开发租房系统终极版(可运行 附数据库脚本) 最近看了CSDN上几个Hibernate开发的租房系统 不是版本太老就是不能运行 闹心了一星期 自己终于成功运行 另附上Oracle开发脚本 注意:一 MyEclipse8的可直接...
hibernate4.3.8 自带demo