最近在将数据层从 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支持多种数据库,包括MySQL、Oracle、PostgreSQL等,具有高度可移植性。 **二、Hibernate配置文件** 在Hibernate中,`hibernate.cfg.xml`是核心配置文件,用于定义数据源、SessionFactory等信息。要让...
hibernate@注解方式配置实体类时,利用javadoc接口生成数据库表及字段的注释说明,支持oracle、sqlserver、db2、mysql数据库。因用到java\lib\tools.jar,需要将该jar放入工程lib下(或者tomcat\lib下、或加入...
其中,主键生成策略是Hibernate配置中的一个重要部分,它决定了表中的主键值如何生成。本文将重点介绍在Oracle数据库环境下,使用Hibernate的“native”策略来生成主键的具体方法及注意事项。 #### 二、主键生成...
本文将深入探讨如何在Hibernate中实现Oracle数据库的自动增长特性,这一功能对于确保数据表中的主键唯一性至关重要。 ### Oracle数据库的自动增长机制 Oracle数据库提供了强大的序列(sequence)功能来支持自动增长...
* 数据库方言:MySQL、Oracle、SQL Server等 * 事务类型:RESOURCE_LOCAL、JTA等 * 自动生成DDL语句:hibernate.hbm2ddl.auto 五、持久化文件persistence.xml persistence.xml文件是JPA的配置文件,该文件用于配置...
在Java的持久化框架Hibernate中,主键生成策略是一个至关重要的概念,它决定了数据库表中主键值如何自动生成。主键通常是表中唯一标识记录的一列,对于数据的完整性和一致性至关重要。以下是对Hibernate中主键生成...
### Hibernate 主键生成策略详解 #### 一、概述 Hibernate 是一款开源的对象关系映射 (ORM) 框架,它允许开发人员将 Java 对象映射到数据库表中的记录,从而极大地简化了数据访问层的开发工作。在 Hibernate 中,...
在使用 Hibernate 进行持久化操作时,经常需要处理实体类的主键问题。Hibernate 提供了多种主键生成策略,每种策略都有其特定的应用场景和优缺点。 #### 二、详细解释 接下来,我们将详细介绍给定文件中提到的几种...
在Java的持久化框架Hibernate中,主键生成策略是一个关键的概念,它决定了如何为数据库中的实体对象生成唯一的标识符(主键)。以下是关于Hibernate主键生成方式的详细说明: 1. **Identity方式**:`...
**hibernate实体生成工具**是开发者在使用Hibernate框架时常用的一种辅助工具,它能够自动生成与数据库表对应的Java实体类,大大节省了手动编写代码的时间,提高了开发效率。Hibernate是一个强大的对象关系映射(ORM...
在Java的持久化框架Hibernate中,ID生成策略是至关重要的一个环节。它是用来唯一标识数据库中每一行记录的关键部分。本教程将详细讲解Hibernate中的ID生成策略,以及如何在实际项目中灵活应用。 首先,ID生成策略是...
Middlegen支持多种数据库,包括Oracle、MySQL等,使得开发者无需手动编写这些繁琐的XML文件,从而更加专注于业务逻辑的实现。`Middlegen-Hibernate-r5.zip`可能包含了Middlegen的特定版本,包括其源代码、执行脚本和...
- **应用场景**:在 Oracle 数据库中常见,因为 Oracle 不支持自增字段,而 Sequence 是一种高效的解决方案。 #### 5. Identity - **描述**:利用 SQL Server 和 MySQL 的 AUTO_INCREMENT 特性自动为字段分配下一...
- 选择合适的ID生成策略(例如MySQL中通常选择`native`,而Oracle则可能需要`sequence`)。 - 修改表字段类型,使其与Java类型相匹配。 9. **查看生成的实体类**: - 返回Java项目视图,打开项目的`src`目录下的`...
在Java的持久化框架Hibernate中,主键的生成策略是一个重要的概念,它涉及到数据库表记录的唯一标识如何自动生成。本篇文章将详细讲解Hibernate映射文件中关于主键生成的各种策略及其配置,帮助开发者更好地理解和...
在生成的DTO和POJO类中,注解可以用来标记字段,以便于框架如Hibernate或MyBatis进行ORM(对象关系映射)操作。 `JavaBeanTool_2.0`可能是插件的一个版本号,暗示这个工具已经经过了多次迭代和优化。JavaBean是一种...