JPA: Wie speichere ich einen String in einem Datenbankfeld? Geben Sie MYSQL Text ein

80

Voraussetzung ist, dass der Benutzer einen Artikel schreiben kann, daher wähle ich den Typ Textfür das contentFeld in der MySQL-Datenbank. Wie kann ich umwandeln Java StringinMySQL Text

Bitte schön 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 meiner MYSQL-Datenbank contentist Typ Text. Ich hatte gehofft, dass es so etwas geben würde java.sql.Text, da java.sql.Blobes sich um einen tatsächlichen Typ handelt, aber leider existiert dieser nicht

Thang Pham
quelle

Antworten:

130

Da Sie JPA verwenden, verwenden Sie die LobAnmerkung (und optional die ColumnAnmerkung). In der JPA-Spezifikation heißt es dazu:

9.1.19 Lob Annotation

Eine LobAnmerkung gibt an, dass eine persistente Eigenschaft oder ein beständiges Feld als großes Objekt für einen datenbankgestützten großen Objekttyp beibehalten werden soll. Tragbare Anwendungen sollten die LobAnmerkung verwenden, wenn sie einem Datenbank-Lob-Typ zugeordnet werden. Die Lob-Annotation kann in Verbindung mit der BasicAnnotation verwendet werden. Ein Lob kann entweder ein Binär- oder ein Zeichentyp sein. Der Lob-Typ wird aus dem Typ des persistenten Felds oder der persistenten Eigenschaft abgeleitet, und mit Ausnahme von Zeichenfolgen- und zeichenbasierten Typen wird standardmäßig Blob verwendet.

Erklären Sie also so etwas:

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

Verweise

  • JPA 1.0-Spezifikation:
    • Abschnitt 9.1.19 "Lob Annotation"
Pascal Thivent
quelle
25
In Hibernate JPA MYSQL ergibt die Verwendung der @LobPlus- @ColumnAnnotation in einem String-Feld "falscher Spaltentyp, erwarteter Langtext, aber Spaltentyp ist Text". Aber das Problem ist gelöst, als ich@Column(columnDefinition = "text")
Gerrytan
4
Was macht es Sinn, @Lobund zu kombinieren @Column(length=512)? Warum nicht einfach glücklich sein mit @Lob? Beides macht bei der Verwendung von Hibernate JPA MySQL keinen Unterschied. Beides führt zum MySQL-Feldtyp longtext.
Sokrates
Ich hatte einen binären Spaltentyp und die @LobAnmerkung funktionierte bei mir nicht. Hat aber @Column(length=8192)super geklappt und mein Problem gelöst.
Yanni
105

Mit @Loblande ich immer mit einem LONGTEXTin MySQL.

Um es zu bekommen, TEXTerkläre ich es so (JPA 2.0):

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

Finden Sie dies besser, da ich direkt auswählen kann, welchen Texttyp die Spalte in der Datenbank haben soll.

Für columnDefinitionsie ist auch gut lesen diese .

BEARBEITEN: Bitte beachten Sie den Kommentar von Adam Siemions und überprüfen Sie die von Ihnen verwendete Datenbank-Engine, bevor Sie sich bewerben columnDefinition = "TEXT".

Reitffunk
quelle
4
Dies ist keine gute Lösung, da die TEXT- Datenspalte
Adam Siemion
1
Dies ist, was ich wollte, weil es das ist, was in allen Produktionsdatenbanken verfügbar ist und nicht das Problem mit "Langtext" hat, wenn ich es nicht will.
Nicholas DiPiazza
25

für mysql 'text':

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

für mysql 'longtext':

@Lob
private String description;
Maxpan
quelle