1. 序章

このクイックチュートリアルでは、JPA仕様で定義されたアノテーションを使用してPostgreSQLTEXTタイプを管理する方法を説明します。

2. PostgreSQLのTEXTタイプ

PostgresSQLを使用する場合、定期的に任意の長さの文字列を格納する必要があります。

このために、PostgreSQLは3つの文字タイプを提供します。

  • CHAR(n)
  • VARCHAR(n)
  • 文章

残念ながら、TEXTタイプは、SQL標準によって管理されるタイプの一部ではありません。 これは、永続エンティティでJPAアノテーションを使用する場合、問題が発生する可能性があることを意味します

これは、JPA仕様がSQL標準を利用しているためです。 したがって、it は、たとえば@Textアノテーションを使用してこのタイプのオブジェクトを処理する簡単な方法を定義していません。

幸い、PostgreSQLデータベースのTEXTデータ型を管理するためのいくつかの可能性があります。

  • @Lobアノテーションを使用できます
  • または、@ColumnアノテーションをcolumnDefinition属性と組み合わせて使用することもできます。

次に、@Lobアノテーションで始まる2つのソリューションを見てみましょう。

3. @Lob

名前が示すように、lobは l arge objectです。 データベース用語では、 lob列は、非常に長いテキストまたはバイナリファイルを格納するために使用されます。

2種類のロブから選択できます。

  • CLOB –テキストの格納に使用される文字LOB
  • BLOB –バイナリデータの保存に使用できるバイナリLOB

JPA @Lob アノテーションを使用して、大きなフィールドを大きなデータベースオブジェクトタイプにマップできます。

String型属性で@Lobレコードを使用する場合、JPA仕様では、永続性プロバイダーは属性の値を格納するために大きな文字型オブジェクトを使用する必要があると規定されています。 その結果、PostgreSQLは文字LOBをTEXTタイプに変換できます。

descriptionフィールドを持つ単純なExamエンティティオブジェクトがあり、任意の長さであると仮定します。

@Entity
public class Exam {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;

    @Lob
    private String description;
}

説明フィールドの@Lobアノテーションを使用して、PostgreSQLTEXTタイプを使用してこのフィールドを管理するようにHibernateに指示します。

4. @Column

TEXTタイプを管理するための別のオプションは、@ColumnアノテーションをcolumnDefinitionプロパティと一緒に使用することです。

同じExamエンティティオブジェクトをもう一度使用しますが、今回は任意の長さのTEXTフィールドを追加します。

@Entity
public class Exam {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;
    
    @Lob
    private String description;
    
    @Column(columnDefinition="TEXT")
    private String text;

}

この例では、アノテーション @Column(columnDefinition =” TEXT”)を使用します。 columnDefinition 属性を使用すると、このタイプのデータ列を作成するときに使用されるSQLフラグメントを指定できます。

5. すべてをまとめる

このセクションでは、ソリューションが機能していることを確認するための簡単な単体テストを作成します。

@Test
public void givenExam_whenSaveExam_thenReturnExpectedExam() {
    Exam exam = new Exam();
    exam.setDescription("This is a description. Sometimes the description can be very very long! ");
    exam.setText("This is a text. Sometimes the text can be very very long!");

    exam = examRepository.save(exam);

    assertEquals(examRepository.find(exam.getId()), exam);
}

この例では、新しい Exam オブジェクトを作成し、それをデータベースに永続化することから始めます。  次に、データベースから Exam オブジェクトを取得し、その結果を作成した元の試験と比較します。

ポイントを示すために、Examエンティティの説明フィールドをすばやく変更すると次のようになります。

@Column(length = 20)
private String description;

テストを再度実行すると、エラーが表示されます。

ERROR o.h.e.jdbc.spi.SqlExceptionHelper - Value too long for column "TEXT VARCHAR(20)"

6. 結論

このチュートリアルでは、PostgreSQLTEXTタイプでJPAアノテーションを使用するための2つのアプローチについて説明しました。

まず、TEXTタイプの使用目的を説明し、次にJPAアノテーション@Lobおよび@Column を使用して、TEXTタイプを使用して文字列オブジェクトを保存する方法を確認しました。 PostgreSQLによって定義されています。

いつものように、記事の完全なソースコードは、GitHubから入手できます。