JPA: як зберегти рядок у полі бази даних, введіть MYSQL Text


82

Вимога полягає в тому, що користувач може написати статтю, тому я вибираю тип Textдля contentполя всередині бази даних mysql. Як я можу конвертувати Java StringвMySQL 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це справжній тип, але, на жаль, такого не існує

Відповіді:


131

Оскільки ви використовуєте JPA, використовуйте Lobанотацію (і, за бажанням, Columnанотацію). Ось що про це говорить специфікація JPA:

9.1.19 Анотація Lob

A 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 використання анотації @Lobплюс @Columnу полі Рядок дає "неправильний тип стовпця, очікуваний довгий текст, але тип стовпця - текст". Але проблема вирішена, коли я використовував@Column(columnDefinition = "text")
gerrytan

4
Який сенс поєднувати @Lobта @Column(length=512)? Чому б просто не бути задоволеним @Lob? Обидва вони не мають різниці при використанні Hibernate JPA MySQL. І те, і інше призводить до типу поля MySQL longtext.
Сократ

У мене був двійковий тип стовпця, і @Lobанотація для мене не працювала. Однак @Column(length=8192)чудово працював і вирішив мою проблему.
yanni

110

З @Lobя завжди закінчую з LONGTEXTMySQL.

Щоб отримати, TEXTя заявляю це таким чином (JPA 2.0):

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

Знайдіть це краще, тому що я можу безпосередньо вибрати, який тип тексту матиме стовпець у базі даних.

Для columnDefinitionнього це теж добре читати це .

РЕДАГУВАТИ: Будь ласка, зверніть увагу на коментар Адама Сіміона та перевірте механізм баз даних, який ви використовуєте, перед тим, як подати заявку columnDefinition = "TEXT".


4
Це не є хорошим рішенням, так як стовпець TEXT дані не доступний у всіх базах даних, наприклад , двигуни HSQLDB, деталі: stackoverflow.com/questions/4213782 / ...
Adam Siemion

1
це те, що я хотів, тому що це те, що доступне у всіх виробничих базах даних, і не має проблеми з "довгим текстом", коли я цього не хочу.
Nicholas DiPiazza

28

для mysql 'текст':

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

для mysql 'longtext':

@Lob
private String description;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.