Мы используем аннотированный тип JPA, который выглядит следующим образом (groovy code):
@Entity
@EqualsAndHashCode
class TextNote extends Serializable {
@Id Long id
String text
}
Когда он был впервые написан, я был очень знаком с JPA и сначала написал SQL, а затем аннотированные классы соответствовали SQL. Чтение на PostgreSQL показалось мне следующим:
CREATE TABLE textnote (
id bigint NOT NULL,
text text
);
Это сработало, и у нас были таблицы, которые выглядели так:
id | text
-----+------------------------
837 | really long text here
Теперь я хочу, чтобы JPA Entity выглядела так:
@Entity
@EqualsAndHashCode
class TextNote extends Serializable {
@Id Long id
@Lob String text
}
Добавив аннотацию @Lob
, поставщик JPA (в моем случае, спящий режим) может корректно создать DDL для меня, если мы захотим поменять базы данных. Он также документирует то, что я хочу, чтобы текстовое поле было. Теперь, когда создается заметка, я вижу что-то вроде этого:
id | text
-----+------------------------
837 | 33427
Что хорошо для новых заметок, так как когда я читаю его в коде с помощью String getText(), он возвращает действительно длинный текст. Честно говоря, я не знаю, как PostgreSQL реализует тип text
, и мне не нужно теоретически. Однако в нашей базе данных уже есть много заметок, сохраненных с использованием старого кода без аннотации @Lob
. Запуск нового кода в существующей базе данных вызывает такие проблемы:
org.springframework.dao.DataIntegrityViolationException: Bad value for type long : not a number this time; SQL [n/a]; nested exception is org.hibernate.exception.DataException: Bad value for type long : not a number this time
Для существующих заметок есть ли способ в SQL для переноса старых заметок для правильного использования типов @Lob
и text
? Спасибо заранее.