Home » Mysql » JPA: how do I persist a String into a database field, type MYSQL Text

JPA: how do I persist a String into a database field, type MYSQL Text

Posted by: admin November 1, 2017 Leave a comment

Questions:

The requirement is that the user can write an article, therefore I choose type Text for the content field inside mysql database. How can I convert Java String into MySQL Text

Here you go 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
}

In my MYSQL database, content is type Text. I was hoping that there would be something like this java.sql.Text, since java.sql.Blob is an actual type, but sadly, that does not exist

Answers:

Since you’re using JPA, use the Lob annotation (and optionally the Column annotation). Here is what the JPA specification says about it:

9.1.19 Lob Annotation

A Lob annotation specifies that a
persistent property or field should be
persisted as a large object to a
database-supported large object type.
Portable applications should use the
Lob annotation when map- ping to a
database Lob type. The Lob annotation
may be used in conjunction with the
Basic annotation. A Lob may be
either a binary or character type. The
Lob type is inferred from the type of
the persistent field or property, and
except for string and character-based
types defaults to Blob.

So declare something like this:

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

References

  • JPA 1.0 specification:
    • Section 9.1.19 “Lob Annotation”
Questions:
Answers:

With @Lob I always end up with a LONGTEXTin MySQL.

To get TEXT I declare it that way (JPA 2.0):

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

Find this better, because I can directly choose which Text-Type the column will have in database.

For columnDefinition it is also good to read this.

EDIT: Please pay attention to Adam Siemions comment and check the database engine you are using, before applying columnDefinition = "TEXT".

Questions:
Answers:

for mysql ‘text’:

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

for mysql ‘longtext’:

@Lob
private String description;