JPA: jak zachować ciąg znaków w polu bazy danych, wpisz tekst MYSQL

83

Wymagane jest, aby użytkownik mógł napisać artykuł, dlatego wybieram typ Textdla contentpola w bazie danych mysql. Jak mogę zamienić się Java StringnaMySQL Text

Proszę bardzo 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
}

W mojej bazie danych MYSQL contentjest typ Text. Miałem nadzieję, że będzie coś takiego java.sql.Text, ponieważ java.sql.Blobjest to rzeczywisty typ, ale niestety, którego nie ma

Thang Pham
źródło

Odpowiedzi:

132

Ponieważ używasz JPA, użyj Lobadnotacji (i opcjonalnie Columnadnotacji). Oto, co mówi o tym specyfikacja JPA:

9.1.19 Adnotacja Lob

A LobOkreśla adnotacji, że utrzymująca się nieruchomość lub pole powinno być utrwalone w postaci dużego obiektu do dużego typu obiektu bazy danych obsługiwane. Aplikacje przenośne powinny używać Lobadnotacji podczas mapowania na typ Lob bazy danych. Adnotacji Lob można używać w połączeniu z Basicadnotacją. Lob może być typem binarnym lub znakowym. Typ Lob jest wywnioskowany na podstawie typu trwałego pola lub właściwości, z wyjątkiem typów opartych na ciągach i znakach, domyślnie jest to Blob.

Więc zadeklaruj coś takiego:

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

Bibliografia

  • Specyfikacja JPA 1.0:
    • Sekcja 9.1.19 „Adnotacja Lob”
Pascal Thivent
źródło
25
W Hibernate JPA MYSQL użycie adnotacji @Lobplus @Columnw polu String daje „niewłaściwy typ kolumny, oczekiwany długi tekst, ale typ kolumny to tekst”. Ale problem został rozwiązany, gdy użyłem@Column(columnDefinition = "text")
gerrytan
4
Jaki jest sens w łączeniu @Lobi @Column(length=512)? Dlaczego nie być po prostu szczęśliwym @Lob? Oba nie mają znaczenia przy korzystaniu z Hibernate JPA MySQL. Oba dają w wyniku typ pola MySQL longtext.
Socrates,
Miałem typ kolumny binarnej, a @Lobadnotacja nie działała. Jednak @Column(length=8192)zadziałało świetnie i rozwiązało mój problem.
yanni
110

Z @LobI zawsze kończy się z LONGTEXTMySQL.

Aby uzyskać TEXT, deklaruję to w ten sposób (JPA 2.0):

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

Znajdź to lepiej, ponieważ mogę bezpośrednio wybrać typ tekstu, który kolumna będzie miała w bazie danych.

Na columnDefinitionto również dobre do czytania tego .

EDYCJA: Prosimy o zwrócenie uwagi na komentarz Adama Siemionsa i sprawdzenie używanego silnika bazy danych przed złożeniem wniosku columnDefinition = "TEXT".

Reitffunk
źródło
4
To nie jest dobre rozwiązanie, ponieważ kolumna danych TEXT nie jest dostępna we wszystkich silnikach baz danych, np. HSQLDB, szczegóły: stackoverflow.com/questions/4213782/…
Adam Siemion
1
właśnie tego chciałem, ponieważ jest to dostępne we wszystkich produkcyjnych bazach danych i nie ma problemu z „długim tekstem”, gdy tego nie chcę.
Nicholas DiPiazza
29

dla mysql 'text':

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

dla mysql 'longtext':

@Lob
private String description;
Maxpan
źródło