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 update を使用している場合、代わりにそのタイプを使用するように列が作成されます (データベース固有)。

于 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

これは実際にはDBエラーです。

Data too long for column 'introText'

DB の introText 列を確認してください。おそらくサイズが制限されている varchar です。テキストが切り詰められないように、ストレージ タイプをより大きなものに変更する必要があります。

そうでないと思う場合は、マッピングとスキーマを表示する必要があります。

于 2010-01-24T21:17:45.787 に答える