如何在使用 JPA 映射时增加 mysql 中字符串的长度

Posted

技术标签:

【中文标题】如何在使用 JPA 映射时增加 mysql 中字符串的长度【英文标题】:How to increase length of a String in mysql while mapping using JPA 【发布时间】:2011-11-22 12:17:10 【问题描述】:

我在 JPA 中遇到了一些麻烦。如果有人可以提供解决方案,我将非常感激。有了 JPA(我正在使用 mysql DB),可以说,我有一个映射如下的类:

@Entity    
class Employee    
   int id;    
   String employeeName;    
 //getters and setters...   
 

在映射到表时,我看到String在Mysql中与varchar(255)进行了映射。但是,假设我有一个员工的姓名超过 255 个字符,它会显示数据截断错误。

我知道我们可以通过向 Employee 列添加 "length" 属性来解决这个问题:

@column(length=1000)    
String employeeName;

这是唯一可行的方法吗?我想,如果我们只是映射到java中的String,数据库会动态分配长度。

【问题讨论】:

【参考方案1】:

在映射到表时,我看到String在Mysql中是用varchar(255)映射的

这是因为大多数 JPA 提供程序(包括 Hibernate 和 EclipseLink)创建的 DDL 语句中 VARCHAR 列的默认长度为 255。将 length 属性指定给 @Column 注释有助于覆盖该值,以便新值由 JPA 提供者的模式生成器获取。

我想,如果我们只是映射到java中的String,数据库会动态分配长度。

这是一个错误的假设。 JPA 提供程序只会创建一次表,并且不会在应用程序的生命周期内动态更改基础表的长度,并且只有在您首先配置提供程序以创建/更新表定义时。而且String的默认映射是SQLVARCHAR类型。

您似乎已将 JPA 提供程序配置为在初始化过程中根据需要创建表(在可能删除它们之后)。如果您使用的是 Hibernate,则可以使用在 persistence.xml 中指定的 hibernate.hbm2ddl.auto 属性,其值为 updatecreatecreate-drop。使用 EclipseLink,您可以将属性 eclipselink.ddl-generation 指定为 create-tablesdrop-and-create-tables

Both of the above properties are not recommended for use in a production environment。理想的方法是使用 DDL 脚本来创建表。由于您使用的是VARCHAR,因此您应该在列定义中指定合适的长度,以适应用户输入的最大长度。此外,由于您使用的是VARCHAR 而不是CHAR,因此数据库引擎将确保分配的存储空间取决于所存储记录的大小。

如果您不需要字符串到默认的VARCHAR 映射,而是使用另一个有效的映射,那么您必须使用@Column 注释的columnDefinition 属性。将Calendar 映射到TIMESTAMPTZ SQL 数据类型的示例用法如JPA WikiBook 所示;您需要对其进行修改以满足您的需要。

【讨论】:

您好!如果我需要更改列的长度怎么办?唯一的方法是通过 SQL 查询?【参考方案2】:

varchar 列支持动态大小的长度(没有像 char 那样的填充),但如果您想要 255 以外的值,则必须指定最大列大小。不同的 db 对 char 和 varchar 大小有不同的限制(8k 或 65k 很常见) .

如果你想超越这个限制,你需要为你的字符串添加一个@Lob 注释,以便它映射到一个 CLOB 列类型(假设你让 JPA 生成表)。 CLOB/BLOB 列可以比 varchar 大得多(同样,确切的限制取决于您的数据库)。但是 LOB 有一些限制,例如不能作为主键或在 WHERE 子句中使用。

【讨论】:

以上是关于如何在使用 JPA 映射时增加 mysql 中字符串的长度的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 JPA 和 Hibernate 将 MySQL JSON 列映射到 Java 实体属性

如何使用 JPA/Hibernate 注释将 MySQL char(n) 列映射到实例变量?

将 MySql 视图映射到 JPA 实体,使用哪个唯一 ID?

如何使用 JPA 将 MySQL 枚举映射到 Java 枚举? [复制]

如何使用 JPA 和休眠映射 Java/Kotlin 字符串数组和 Postgres SQL 数组

如何从 JPA 注释的实体类生成 JPA 映射文件?