12

在我的 Web 应用程序中,我有一个文本区域,其用户填充的内容最终会通过 Hibernate 保存到数据库中。我一直遇到一个问题,当用户输入超过一定长度时,持久性会失败。有没有办法通过 Hibernate Annotations 或在配置中指示此特定字段应支持更长的字符串,并且数据库列类型应反映这一点?

这是我得到的例外:

Caused by: java.sql.BatchUpdateException: Data truncation: Data too long for column 'introText' at row 1
    at com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:2007)
    at com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:1443)
    at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70)
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268)
    ... 41 more
4

4 回答 4

27

您可以在注释上使用长度参数,如下所示:

@Column(length=1000)

或者,如果您的数据库支持,您可以将列类型更改为类似文本的内容,如下所示:

@Column(columnDefinition="text")

如果您使用的是 hbm2ddl 更新,则将创建该列以使用该类型(特定于数据库)。

于 2010-01-21T21:06:11.807 回答
5

我有一个类似的问题,我通过将休眠“文本”类型分配给属性来解决:

@Type(type="text")
于 2013-07-05T17:33:05.227 回答
3

对于长字符串或其他大型对象类型,有一个特殊的@Lob注释可以解决您的持久性问题,特别是如果您让 Hibernate 自动生成您的数据库模式。因此,您的实体代码将如下所示:

import javax.persistence.Lob;
...
@Lob
private String introText;

我已经检查了使用 Hibernate 和带@Lob注释的字符串的自动模式生成,在 MariaDB 中,我LONGTEXT有一个最大长度为4,294,967,295 个字符(约 4 GB 数据)的类型列。


请注意,如果您application.properties具有以下 Hibernate 配置spring.jpa.hibernate.ddl-auto=update,则 Hibernate不会自动将您当前的列类型更改为LONGTEXT. 因此,您必须使用您选择的 SQL 工具手动更新列类型,或者(不安全的解决方案,仅在您使用临时测试数据并且可以轻松恢复它时使用)删除数据库并让 Hibernate 从头开始​​重新创建它。

于 2020-01-29T20:32:32.157 回答
0

好的,这实际上是一个数据库错误。

Data too long for column 'introText'

检查数据库中的 introText 列,它可能是一个大小有限的 varchar。您需要将存储类型更改为更大的类型,这样它就不会截断您的文本。

如果您认为不是这样,您将不得不显示您的映射和架构。

于 2010-01-24T21:17:45.787 回答