`
avgguy
  • 浏览: 3636 次
  • 性别: 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通过配置文件自动生成表

    Hibernate支持多种数据库,包括MySQL、Oracle、PostgreSQL等,具有高度可移植性。 **二、Hibernate配置文件** 在Hibernate中,`hibernate.cfg.xml`是核心配置文件,用于定义数据源、SessionFactory等信息。要让...

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

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

    hibernate映射主键生成策略native

    其中,主键生成策略是Hibernate配置中的一个重要部分,它决定了表中的主键值如何生成。本文将重点介绍在Oracle数据库环境下,使用Hibernate的“native”策略来生成主键的具体方法及注意事项。 #### 二、主键生成...

    在hibernate中实现oracle的自动增长

    本文将深入探讨如何在Hibernate中实现Oracle数据库的自动增长特性,这一功能对于确保数据表中的主键唯一性至关重要。 ### Oracle数据库的自动增长机制 Oracle数据库提供了强大的序列(sequence)功能来支持自动增长...

    JPA注解 和hibernate 建表

    * 数据库方言:MySQL、Oracle、SQL Server等 * 事务类型:RESOURCE_LOCAL、JTA等 * 自动生成DDL语句:hibernate.hbm2ddl.auto 五、持久化文件persistence.xml persistence.xml文件是JPA的配置文件,该文件用于配置...

    Hibernate中主键生成策略

    在Java的持久化框架Hibernate中,主键生成策略是一个至关重要的概念,它决定了数据库表中主键值如何自动生成。主键通常是表中唯一标识记录的一列,对于数据的完整性和一致性至关重要。以下是对Hibernate中主键生成...

    Hibernate主键生成策略

    ### Hibernate 主键生成策略详解 #### 一、概述 Hibernate 是一款开源的对象关系映射 (ORM) 框架,它允许开发人员将 Java 对象映射到数据库表中的记录,从而极大地简化了数据访问层的开发工作。在 Hibernate 中,...

    hibernate主键生成策略

    在使用 Hibernate 进行持久化操作时,经常需要处理实体类的主键问题。Hibernate 提供了多种主键生成策略,每种策略都有其特定的应用场景和优缺点。 #### 二、详细解释 接下来,我们将详细介绍给定文件中提到的几种...

    Hibernate主键生成方式

    在Java的持久化框架Hibernate中,主键生成策略是一个关键的概念,它决定了如何为数据库中的实体对象生成唯一的标识符(主键)。以下是关于Hibernate主键生成方式的详细说明: 1. **Identity方式**:`...

    hibernate实体生成工具

    **hibernate实体生成工具**是开发者在使用Hibernate框架时常用的一种辅助工具,它能够自动生成与数据库表对应的Java实体类,大大节省了手动编写代码的时间,提高了开发效率。Hibernate是一个强大的对象关系映射(ORM...

    Hibernate教程02_ID生成策略

    在Java的持久化框架Hibernate中,ID生成策略是至关重要的一个环节。它是用来唯一标识数据库中每一行记录的关键部分。本教程将详细讲解Hibernate中的ID生成策略,以及如何在实际项目中灵活应用。 首先,ID生成策略是...

    hibernate生成java,xml

    Middlegen支持多种数据库,包括Oracle、MySQL等,使得开发者无需手动编写这些繁琐的XML文件,从而更加专注于业务逻辑的实现。`Middlegen-Hibernate-r5.zip`可能包含了Middlegen的特定版本,包括其源代码、执行脚本和...

    hibernate 主键生成策略

    - **应用场景**:在 Oracle 数据库中常见,因为 Oracle 不支持自增字段,而 Sequence 是一种高效的解决方案。 #### 5. Identity - **描述**:利用 SQL Server 和 MySQL 的 AUTO_INCREMENT 特性自动为字段分配下一...

    MyEclipse自动生成hibernate实体类配置文件

    - 选择合适的ID生成策略(例如MySQL中通常选择`native`,而Oracle则可能需要`sequence`)。 - 修改表字段类型,使其与Java类型相匹配。 9. **查看生成的实体类**: - 返回Java项目视图,打开项目的`src`目录下的`...

    Hibernate映射文件主键的生成

    在Java的持久化框架Hibernate中,主键的生成策略是一个重要的概念,它涉及到数据库表记录的唯一标识如何自动生成。本篇文章将详细讲解Hibernate映射文件中关于主键生成的各种策略及其配置,帮助开发者更好地理解和...

    hibernate中自动生成主键的办法

    Hibernate作为一款流行的Java持久层框架,提供了多种自动生成主键的方法,以适应不同场景的需求。本文将深入探讨Hibernate中自动生成主键的几种常见策略及其应用场景。 ### 1. UUID.hex UUID(Universally Unique ...

Global site tag (gtag.js) - Google Analytics