使用 Hibernate 持续存在长字符串的问题
Posted
技术标签:
【中文标题】使用 Hibernate 持续存在长字符串的问题【英文标题】:Issue persisting long strings with Hibernate 【发布时间】:2011-01-07 22:23:30 【问题描述】:在我的 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
【问题讨论】:
你为什么说它失败了?它会在后端静默截断字符串还是收到错误消息?如果你告诉 hibernate 它是字符串类型,它会尝试保存所有内容。 用户内容设置在 String 对象中。持久化过程中抛出异常。 你能把例外放在你的帖子里吗? :) 或许还有你当前映射中的 sn-p。 亚瑟,感谢您的跟进。我会尽快发布例外情况。 【参考方案1】:您可以在注释上使用长度参数,如下所示:
@Column(length=1000)
或者,如果您的数据库支持,您可以将列类型更改为类似文本的内容,如下所示:
@Column(columnDefinition="text")
如果您使用的是 hbm2ddl 更新,则将创建列以使用该类型(特定于数据库)。
【讨论】:
只是为了补充,这里的长度需要是一个int,因此@Column(length=1000) 对于我们的项目,我们希望 psql 数据库对一些没有指定大小的列使用 VARCHAR 类型。为此,我们使用:@Column(columnDefinition="VARCHAR") 特别是因为在 PostgreSQL 中“varchar”与“text”相同。 ***.com/questions/4848964/… 我试过了,但是出错了。请帮助***.com/questions/25094410/…【参考方案2】:我有一个类似的问题,我通过将休眠“文本”类型分配给属性来解决:
@Type(type="text")
【讨论】:
【参考方案3】:对于长字符串或其他大型对象类型,有一个特殊的 @Lob
注释应该可以解决您的持久性问题,尤其是如果您让 Hibernate 自动生成您的数据库模式。
因此,您的实体代码将如下所示:
import javax.persistence.Lob;
...
@Lob
private String introText;
我已经检查了使用 Hibernate 和 @Lob
带注释的字符串的自动模式生成,在 MariaDB 中,我有一个 LONGTEXT
类型的列,其最大长度为 4,294,967,295 characters(约 4 GB 数据) .
请注意,如果您的
application.properties
具有以下 Hibernate 配置 spring.jpa.hibernate.ddl-auto=update
,则 Hibernate 不会自动将您当前的列类型更改为 LONGTEXT
。
因此,您将不得不更新列类型,或者您选择的 manually with SQL 工具或(不是安全的解决方案,仅在您使用临时测试数据并且可以轻松恢复它时使用)删除数据库并让 Hibernate 从头开始重新创建它。
【讨论】:
【参考方案4】:好的,这实际上是一个数据库错误。
Data too long for column 'introText'
检查数据库中的 introText 列,它可能是一个大小有限的 varchar。您需要将存储类型更改为更大的类型,以免截断您的文本。
如果您认为不是这样,则必须显示您的映射和架构。
【讨论】:
以上是关于使用 Hibernate 持续存在长字符串的问题的主要内容,如果未能解决你的问题,请参考以下文章