JPA:文字列をデータベースフィールドに永続化するにはどうすればよいですか、MYSQLテキストと入力します


83

ユーザーが記事を書くことができるという要件があるTextため、contentmysqlデータベース内のフィールドのタイプを選択します。私はどのように変換することができます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データベースでcontentは、はタイプTextです。私はこのようなものがあるだろうことを期待していたjava.sql.Textことから、java.sql.Blob実際の型ですが、悲しいことに、それは存在しません。

回答:


132

JPAを使用しているので、Lobアノテーション(およびオプションでColumnアノテーション)を使用します。JPA仕様の内容は次のとおりです。

9.1.19Lobアノテーション

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

したがって、次のように宣言します。

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

参考文献

  • JPA 1.0仕様:
    • セクション9.1.19「Lobアノテーション」

25
Hibernate JPA MYSQLでは、Stringフィールドに@Lobplus@Columnアノテーションを使用すると、「間違った列タイプ、予期されるロングテキストですが、列タイプはテキストです」と表示されます。しかし、私が使用したときに問題は解決しました@Column(columnDefinition = "text")
gerrytan 2013

4
組み合わせのセンス何@Lobとは@Column(length=512)?ただ満足してみません@Lobか?Hibernate JPA MySQLを使用する場合、どちらも違いはありません。どちらもMySQLフィールドタイプになりlongtextます。
ソクラテス

バイナリ列タイプを使用していましたが、@Lobアノテーションが機能しませんでした。しかし、@Column(length=8192)うまく機能し、私の問題を解決しました。
ヤニー

110

@Lob私はいつもで終わるLONGTEXTのMySQLインチ

そのようTEXTに宣言するには(JPA 2.0):

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

列にデータベースに含めるテキストタイプを直接選択できるため、これをより適切に見つけることができます。

columnDefinition読むためにも良いです、これを

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


4
TEXTデータ列は、すべてのデータベースエンジン、例えばHSQLDB、詳細には利用できないので、これは、良い解決策ではありません。stackoverflow.com/questions/4213782/...
アダム・シエミオン

1
これは、すべての本番データベースで利用できるものであり、不要な場合の「ロングテキスト」の問題がないため、私が望んでいたものです。
ニコラスディピアッツァ2015年

29

mysqlの場合 'テキスト':

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

mysqlの場合 'longtext':

@Lob
private String description;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.