在我的Web应用程序中,我有一个文本区域,其用户填充的内容最终通过Hibernate持久保存到db。我遇到了一个问题,当用户输入超过一定长度时,持久性就会失败。有没有办法通过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
答案 0 :(得分:20)
您可以在注释上使用length参数,如下所示:
@Column(length=1000)
或者如果您的数据库支持,您可以将列类型更改为类似文本的内容,如下所示:
@Column(columnDefinition="text")
如果您正在使用hbm2ddl update,则将创建该列以使用该类型(特定于数据库)。
答案 1 :(得分:5)
我有一个类似的问题,我通过将hibernate“text”类型分配给属性来解决:
@Type(type="text")
答案 2 :(得分:1)
对于长字符串或其他大对象类型,有一个特殊的@Lob
注释可以解决您的持久性问题,尤其是当您让Hibernate自动生成数据库模式时。
因此,您的实体代码将如下所示:
import javax.persistence.Lob;
...
@Lob
private String introText;
我已经使用Hibernate和带注释的@Lob
的String签出了自动模式生成,在MariaDB中,我得到了类型为LONGTEXT
的列,其最大长度为4,294,967,295 characters(约4 GB的数据)。
application.properties
具有以下Hibernate配置spring.jpa.hibernate.ddl-auto=update
,则Hibernate 不会自动将您当前的列类型更改为LONGTEXT
。
因此,您将必须更新您选择的manually with SQL工具或(不是安全的解决方案,仅当您使用临时测试数据并且可以轻松地还原它时才能使用)。数据库,然后让Hibernate从头开始重新创建它。
答案 3 :(得分:0)
好吧,实际上是DB错误。
Data too long for column 'introText'
检查数据库中的introText列,它可能是一个大小有限的varchar。您需要将存储类型更改为更大的内容,以免截断文本。
如果您认为不是它,则必须显示您的映射和架构。