如何在使用 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
属性,其值为 update
、create
或 create-drop
。使用 EclipseLink,您可以将属性 eclipselink.ddl-generation
指定为 create-tables
或 drop-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 枚举? [复制]