JPA: how do I persist a String into a database field, type MYSQL Text
JavaMysqlOrmJpaJava Problem Overview
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
Java Solutions
Solution 1 - Java
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 mapping 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"
Solution 2 - Java
With @Lob
I always end up with a LONGTEXT
in 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"
.
Solution 3 - Java
for mysql 'text':
@Column(columnDefinition = "TEXT")
private String description;
for mysql 'longtext':
@Lob
private String description;