最近在将数据层从 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接口生成数据库表及字段的注释说明,支持oracle、sqlserver、db2、mysql数据库。因用到java\lib\tools.jar,需要将该jar放入工程lib下(或者tomcat\lib下、或加入...
java代码 生成工具,生成控制层,hibernate,model,servers层,支持oracle,mysql,可以自已扩展,生成表现层代码
功能介绍: 1.自动生成hibernate配置文件 和 javaBean,以及HTML表单文件; 2.支持读取数据库表和字段...8.支持数据库 mysql5,oracle10g,mssql200,mssql2005; 9.数据库中字段如果用下划线分隔,自动采用驼峰式命名
hibernate@注解方式配置实体类时,利用javadoc接口生成数据库表及字段的注释说明,支持oracle、sqlserver、db2、mysql数据库。因用到java\lib\tools.jar,需要将该jar放入工程lib下(或者tomcat\lib下、或引用方式都行...
第12课 使用hibernate工具类将对象模型生成关系模型 19 第13课 ID主键生成策略 20 一、 Xml方式 20 元素(主键生成策略) 20 二、 annotateon方式 21 1、AUTO默认 21 2、IDENTITY 22 3、SEQUENCE 22 4、为Oracle指定...
支持Oracle、DB2、SQLServer、MYSQL、数据库。 支持Struts1、Struts2、SpringMvc、Spring、Hibernate3框架。 支持自增主键,复合主键,外键关联。 生成Hibernate POJO类,Dao类,Service类,Action类。 生成保存,...
* 5.identity 使用SQL Server和MySQL的自增字段,这个方法不能放到Oracle中,Oracle不支持自增字段,要设定sequence(MySQL和SQL Server中很常用)。等同于JPA中的IDENTITY * 例:@GeneratedValue(generator = ...
推荐步骤: 1- 通过PowerDesigner进行数据建模,设计好表,别写好表备注,字段备注。 2- 通过PowerDesigner生成数据库。 3- 通过该工具从数据库生成 ...5- 目前支持 MSSQL2000 MSSQL2005, MYSQL5,Oracle10g 数据库
JEECG敏捷框架可以有效解决信息孤岛问题,生成统一代码、统一规范、统一设计思路,使你能在这个平台上,快速开发出高 效高质量代码,缩短项目开发周期。 功能特点: • 架构技术: Struts2+Spring3+Hibernate4+...
架构技术: Struts2+Spring3+Hibernate4+EasyUI1.3 • 代码生成器:自动生成美观大方的前台页面及后台代码 • 查询条件生成器:动态拼SQL,追加查询条件 • ...支持SQL Server、Oracle和MySQL等主流数据库
支持oracle、db2、sqlserver、mysql、数据库。 支持struts1、struts2、springmvc、spring、hibernate3框架。 支持自增主键,复合主键,外键关联。 生成hibernate pojo类,dao类,service类,action类。 ...
让你不再为配置SSH烦恼,很方便、快捷地生成SSH组合代码。可以提高工作效率。 目前版本支持Strtus+hibernate+spring+mysql 支持oracle与sqlserver的版本正在开发之中。 欢迎相互交流
项目开发过程中,会做一些重复度较高的开发工作(表结构设计、生成数据库建库脚本、数据字典定义、hibernate映射文件编写、POJO对象文件编写、简单的JSP表单页面).在跨数据库平台的小组中甚至要做到一套程序多套...
基于数据库,内建好数据库的model,并支持多种数据库(mysql,sql server,oracle测试通过) 半手工方式,生成的代码放在某个目录,再手工拷贝回来工作区 易于做二次开发,整个生成器本身就是java源代码,源代码核心十分精简,...
以上是Spring+Hibernate将文件二进制数据持久化到数据库的解决方案,而Struts通过将表单中file类型的组件映射为ActionForm中类型为org.apache.struts.upload. FormFile的属性来获取表单提交的文件数据。 工程...
<br>心得: 一、今天才明白使用Hibernate还有一个好处,你可以随便改数据库,你可以一会用oracle,一会用sqlserver,一会用mysql,总之你写成的代码换一种数据库,最多就是改一下那几个xml文件,个人感觉这才是...
它是基于java编写的j2ee代码自动生成工具暨数据库管理工具,运行于jdk1.5环境中,目前版本支持Oracle、mysql、mssql三种常用的数据库,以后会视情况扩充至其它种类的关系型数据库。它的功能类似于MyEclipse的自动...
最近刚刚学的eclipse插件开发,小试牛刀。请多提出宝贵意见、建议,不断改进。 没有资源分的 留邮箱地址。 目前支持oracle、mysql数据库