`
avgguy
  • 浏览: 3512 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
社区版块
存档分类
最新评论

解决 Hibernate 生成表( Mysql,Oracle)的问题

 
阅读更多

    最近在将数据层从 JdbcTemplate 迁移到 JPA/Hibernate 上面去,以支持更广泛的数据库。使用了 hibernate.hbm2ddl.auto=create 之后,理论上是可以自动创建和维护数据库架构的。原本我们用的是简单的 H2 作数据存储,数据层改造后再在H2上测试,没有发现问题。但是在测试 mysql 的时候,发现有几个表不能生成。

   我首先怀疑是列名和保留字冲突了。全部检查过一次后,只发现了一个 interval 的列名有问题。更改了之后,那个表能被正常创建了,但是还有两个表没有创建。查看日志也没有看出什么问题。于是把 hibernate 的日志调到 DEBUG 级别。在 log4j.properties 中加入下面这行:

 

log4j.logger.org.hibernate = DEBUG, A1, F1

 

再看日志,这回找到问题了:

 

2013-03-27 15:32:20,088  5231 DEBUG [main] org.hibernate.tool.hbm2ddl.SchemaUpdate     - create table aaaa (ID bigint not null auto_increment, DESCRIPTION varchar(30720), NAME varchar(255), primary key (ID)) ENGINE=InnoDB

2013-03-27 15:32:20,092  5235 ERROR [main] org.hibernate.tool.hbm2ddl.SchemaUpdate     - HHH000388: Unsuccessful:  create table aaaa (ID bigint not null auto_increment, DESCRIPTION varchar(30720), NAME varchar(255), primary key (ID)) ENGINE=InnoDB

2013-03-27 15:32:20,093  5236 ERROR [main] org.hibernate.tool.hbm2ddl.SchemaUpdate     - Column length too big for column 'DESCRIPTION' (max = 21845); use BLOB or TEXT instead

  

由于 mysql 中 varchar 列在 ASCII 编码下的长度最大为 65535 字节,我创建数据库时指定为 UTF-8 码,所以我的列最大不能超过 21845。但是不行啊,我的数据有可能达到 30K,远远超出 21845 啊!

再去看看 MySQL5Dialect.java:

 

protected void registerVarcharTypes() {
	registerColumnType( Types.VARCHAR, "longtext" );
//	registerColumnType( Types.VARCHAR, 16777215, "mediumtext" );
	registerColumnType( Types.VARCHAR, 65535, "varchar($l)" );
	registerColumnType( Types.LONGVARCHAR, "longtext" );
}

 

看到第4行没?在 65535 范围内的话,String 自动映射成了 varchar。那么我超出这个长度,它就应该会映射成 longtext 了。于是我将那个列的长度设置成 65540。更改之后,那两个表终于成功生成了。

 

至此,Mysql 中的问题成功解决。

 

又开始测试 Oracle,又有两个表生成不了。查看了 DEBUG 日志,发现 Oracle 的表只能有一个 LONG 列。没办法,把 DESCRIPTION 字段改小一点吧。

分享到:
评论

相关推荐

    hibernate@注解方式配置实体类,调用javadoc接口生成数据库表及字段的注释说明

    hibernate@注解方式配置实体类时,利用javadoc接口生成数据库表及字段的注释说明,支持oracle、sqlserver、db2、mysql数据库。因用到java\lib\tools.jar,需要将该jar放入工程lib下(或者tomcat\lib下、或加入...

    java代码自动生成工具

    java代码 生成工具,生成控制层,hibernate,model,servers层,支持oracle,mysql,可以自已扩展,生成表现层代码

    hibernate配置文件工具

    功能介绍: 1.自动生成hibernate配置文件 和 javaBean,以及HTML表单文件; 2.支持读取数据库表和字段...8.支持数据库 mysql5,oracle10g,mssql200,mssql2005; 9.数据库中字段如果用下划线分隔,自动采用驼峰式命名

    hibernate@注解方式配置实体类,用javadoc接口生成数据库表及字段的注释说明

    hibernate@注解方式配置实体类时,利用javadoc接口生成数据库表及字段的注释说明,支持oracle、sqlserver、db2、mysql数据库。因用到java\lib\tools.jar,需要将该jar放入工程lib下(或者tomcat\lib下、或引用方式都行...

    Hibernate笔记 马士兵

    第12课 使用hibernate工具类将对象模型生成关系模型 19 第13课 ID主键生成策略 20 一、 Xml方式 20 元素(主键生成策略) 20 二、 annotateon方式 21 1、AUTO默认 21 2、IDENTITY 22 3、SEQUENCE 22 4、为Oracle指定...

    Java代码生成工具新版

    支持Oracle、DB2、SQLServer、MYSQL、数据库。 支持Struts1、Struts2、SpringMvc、Spring、Hibernate3框架。 支持自增主键,复合主键,外键关联。 生成Hibernate POJO类,Dao类,Service类,Action类。 生成保存,...

    Hibernate注解

    * 5.identity 使用SQL Server和MySQL的自增字段,这个方法不能放到Oracle中,Oracle不支持自增字段,要设定sequence(MySQL和SQL Server中很常用)。等同于JPA中的IDENTITY * 例:@GeneratedValue(generator = ...

    HibernateTools-2.0 java版本

    推荐步骤: 1- 通过PowerDesigner进行数据建模,设计好表,别写好表备注,字段备注。 2- 通过PowerDesigner生成数据库。 3- 通过该工具从数据库生成 ...5- 目前支持 MSSQL2000 MSSQL2005, MYSQL5,Oracle10g 数据库

    spring+struts+hibernate半自动开发.zip

    JEECG敏捷框架可以有效解决信息孤岛问题,生成统一代码、统一规范、统一设计思路,使你能在这个平台上,快速开发出高 效高质量代码,缩短项目开发周期。 功能特点: • 架构技术: Struts2+Spring3+Hibernate4+...

    jeecg代码生成器

    架构技术: Struts2+Spring3+Hibernate4+EasyUI1.3 • 代码生成器:自动生成美观大方的前台页面及后台代码 • 查询条件生成器:动态拼SQL,追加查询条件 • ...支持SQL Server、Oracle和MySQL等主流数据库

    Java代码生成工具(傻瓜式操作无需教程的代码生成工具) v2.0.zip

    支持oracle、db2、sqlserver、mysql、数据库。  支持struts1、struts2、springmvc、spring、hibernate3框架。  支持自增主键,复合主键,外键关联。  生成hibernate pojo类,dao类,service类,action类。  ...

    SSH自动代码生成器

    让你不再为配置SSH烦恼,很方便、快捷地生成SSH组合代码。可以提高工作效率。 目前版本支持Strtus+hibernate+spring+mysql 支持oracle与sqlserver的版本正在开发之中。 欢迎相互交流

    脚本批量生成工具,从Excel生成脚本

    项目开发过程中,会做一些重复度较高的开发工作(表结构设计、生成数据库建库脚本、数据字典定义、hibernate映射文件编写、POJO对象文件编写、简单的JSP表单页面).在跨数据库平台的小组中甚至要做到一套程序多套...

    好用的代码生成源码

    基于数据库,内建好数据库的model,并支持多种数据库(mysql,sql server,oracle测试通过) 半手工方式,生成的代码放在某个目录,再手工拷贝回来工作区 易于做二次开发,整个生成器本身就是java源代码,源代码核心十分精简,...

    ssh(structs,spring,hibernate)框架中的上传下载

     以上是Spring+Hibernate将文件二进制数据持久化到数据库的解决方案,而Struts通过将表单中file类型的组件映射为ActionForm中类型为org.apache.struts.upload. FormFile的属性来获取表单提交的文件数据。  工程...

    用Struts、Hibernate和display超简单实现分页

    <br>心得: 一、今天才明白使用Hibernate还有一个好处,你可以随便改数据库,你可以一会用oracle,一会用sqlserver,一会用mysql,总之你写成的代码换一种数据库,最多就是改一下那几个xml文件,个人感觉这才是...

    haivDb4J2ee1.3

    它是基于java编写的j2ee代码自动生成工具暨数据库管理工具,运行于jdk1.5环境中,目前版本支持Oracle、mysql、mssql三种常用的数据库,以后会视情况扩充至其它种类的关系型数据库。它的功能类似于MyEclipse的自动...

    根据数据库表结构生成javabean的Eclipse插件

    最近刚刚学的eclipse插件开发,小试牛刀。请多提出宝贵意见、建议,不断改进。 没有资源分的 留邮箱地址。 目前支持oracle、mysql数据库

Global site tag (gtag.js) - Google Analytics