如何在使用JPA进行映射时增加mysql中String的长度

我在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,数据库将动态分配长度。

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

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

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

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

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

建议不要在生产环境中使用上述两个属性 。 理想的方法是使用DDL脚本来创建表。 因为您使用的是VARCHAR ,所以您应该在列定义中指定合适的长度, 以适应用户输入的最大长度 。 此外,由于您使用VARCHAR不是CHAR ,数据库引擎将确保分配的存储空间将取决于所存储记录的大小。

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

varchar列支持动态大小的长度(没有像char一样的填充)但是如果你想要除了255以外的东西你必须指定最大列大小。不同的dbs对char和varchar大小有不同的限制(通常是8k或65k)。

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