使用Hibernate发出持久字符串的问题

问题描述 投票:7回答:4

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

这是我得到的例外:

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 annotations hibernate-annotations
4个回答
21
投票

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

@Column(length=1000)

或者如果数据库支持,则可以将列类型更改为类似于文本的内容,例如:

@Column(columnDefinition="text")

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


5
投票

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

@Type(type="text")

0
投票

确定这实际上是数据库错误。

Data too long for column 'introText'

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

如果不是这样,则必须显示映射和架构。


0
投票

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

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

[我已经用hibernate和@Lob注释了String签出了自动模式生成,在MariaDB中,我得到了LONGTEXT类型的列,它具有maximum length of 4,294,967,295 characters(约4 GB数据)。


请注意,如果您的application.properties具有spring.jpa.hibernate.ddl-auto=update休眠配置,则休眠将not自动将您当前的列类型更改为LONGTEXT

您可以签出this tutorial,以了解有关@Lob批注如何工作的更多详细信息。

© www.soinside.com 2019 - 2024. All rights reserved.