gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 06:31:31 28 4
gpt4 key购买 nike

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

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

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

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

@column(length=1000)    
String employeeName;

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

最佳答案

when mapping to the table, I see that String is mapped with varchar(255) in Mysql

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

I thought, if we just map to String in java, the database would dynamically assign length.

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

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

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

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

关于java - 如何在使用 JPA 映射时增加 mysql 中字符串的长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7509769/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com