web-dev-qa-db-ja.com

JPA:文字列をデータベースフィールドに永続化するには、MYSQL Textと入力します

要件は、ユーザーが記事を書くことができることです。したがって、mysqlデータベース内のTextフィールドにタイプcontentを選択します。 Java StringMySQL Textに変換するにはどうすればよいですか

ここに行きますJim Tough

@Entity
public class Article implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private Long userId;

    private String title;

    private String content;

    private Integer vote;

    //Constructors, setters, getters, equals and hashcode
}

MYSQLデータベースでは、contentText型です。 Java.sql.Textは実際の型であるため、このようなJava.sql.Blobが存在することを期待していましたが、残念ながら、それは存在しません

72
Thang Pham

JPAを使用しているため、Lobアノテーション(およびオプションでColumnアノテーション)を使用します。 JPA仕様には、次のように記載されています。

9.1.19ロブ注釈

Lob注釈は、永続プロパティまたはフィールドを、データベースでサポートされるラージオブジェクトタイプのラージオブジェクトとして永続化することを指定します。ポータブルアプリケーションは、データベースのLob型にマッピングするときにLob注釈を使用する必要があります。 Lob注釈は、Basic注釈と共に使用できます。 Lobは、バイナリタイプまたは文字タイプのいずれかです。 Lobタイプは、永続フィールドまたはプロパティのタイプから推測されます。ただし、文字列および文字ベースのタイプを除き、デフォルトはBlobです。

そのため、次のように宣言します。

@Lob 
@Column(name="CONTENT", length=512)
private String content;

参照資料

  • JPA 1.0仕様:
    • 9.1.19項「ロブ注釈」
121
Pascal Thivent

@Lobを使用すると、MySQLでは常にLONGTEXTになります。

TEXTを取得するには、そのように宣言します(JPA 2.0):

@Column(columnDefinition = "TEXT")
private String text

これは、データベース内の列のテキストタイプを直接選択できるためです。

columnDefinitionの場合、 this と読むこともできます。

編集:Adam Siemions comment に注意を払い、columnDefinition = "TEXT"を適用する前に、使用しているデータベースエンジンを確認してください。

91
Reitffunk

mysql 'text'の場合:

@Column(columnDefinition = "TEXT")
private String description;

mysql 'longtext'の場合:

@Lob
private String description;
18
Maxpan