次のようなJPA注釈付きタイプを使用しています(Groovyコード)。
@Entity
@EqualsAndHashCode
class TextNote extends Serializable {
@Id Long id
String text
}
それが最初に書かれたとき、私はJPAに非常に慣れておらず、最初にSQLを書き、次に注釈付きクラスをSQLと一致させました。PostgreSQLを読んでみると、私が欲しかったテーブルは次のようでした。
CREATE TABLE textnote (
id bigint NOT NULL,
text text
);
これは機能し、次のようなテーブルがありました。
id | text
-----+------------------------
837 | really long text here
私が今やりたいのは、JPAエンティティを次のように修正することです。
@Entity
@EqualsAndHashCode
class TextNote extends Serializable {
@Id Long id
@Lob String text
}
アノテーションを追加すること@Lob
で、データベースを交換したい場合に備えて、JPAプロバイダー(私の場合は休止状態)がDDLを正しく生成できます。また、テキストフィールドを正確に文書化します。メモが作成されると、次のように表示されます。
id | text
-----+------------------------
837 | 33427
String getText()を使用してコードで読み取ると、非常に長いテキストが返されるため、これは新しいメモには問題ありません。正直なところ、PostgreSQLがこの型をどのように実装しているかはわかりませんtext
し、理論的にもそうする必要はありません。ただし、本番データベースには、@Lob
注釈なしの古いコードを使用して保存された多くのメモがすでにあります。既存のデータベースで新しいコードを実行すると、次のような問題が発生します。
org.springframework.dao.DataIntegrityViolationException: Bad value for type long : not a number this time; SQL [n/a]; nested exception is org.hibernate.exception.DataException: Bad value for type long : not a number this time
既存のメモの場合、SQLで古いメモを移行して、正しく使用@Lob
および入力する方法はありますか?text
前もって感謝します。