Ошибка в Hibernate: SQL Error: 8152, SQLState: 22001 — как решить?

Я постоянно на работе и в своих маленьких проектах сталкиваюсь с разными проблемами, но совсем забываю их описывать в блоге. Пока нахожу решение, приходит время перебираться к следующей задаче, и посты-отчёты о приобретённых знаниях так и не появляются. Сегодня я сделаю исключение — напишу небольшую заметку о том, как я решил небольшую проблемку с Hibernate.

Итак, после добавления нового столбца в табличку в базе данных у меня часто в логах стала появляться ошибка

15-Jun-2023 18:00:58.394 WARN [http-nio-8080-exec-3] org.hibernate.engine.jdbc.spi.SqlExceptionHelper.logExceptions SQL Error: 0, SQLState: 22001
15-Jun-2023 18:00:58.395 ERROR [http-nio-8080-exec-3] org.hibernate.engine.jdbc.spi.SqlExceptionHelper.logExceptions Data truncation
15-Jun-2023 18:00:58.396 WARN [http-nio-8080-exec-3] org.hibernate.engine.jdbc.spi.SqlExceptionHelper.logExceptions SQL Error: 8152, SQLState: 22001
15-Jun-2023 18:00:58.398 ERROR [http-nio-8080-exec-3] org.hibernate.engine.jdbc.spi.SqlExceptionHelper.logExceptions 
Символьные или двоичные данные могут быть усечены.

Если у вас ошибки выводятся на английском языке, то вы увидите сообщение String or binary data would be truncated.

Что может быть причиной этой ошибки?

Такая ошибка может появиться, если вы в модели неправильно объявили поле. Например, вместо @ManyToOne обозначили, как обычную колонку.

@Column(name="id_party")
private ProductionParty party;

Починить это довольно легко, но для этого придётся внимательно пересмотреть нужный класс. Почему-то такие ошибки сложно заметить. Кажется, что всё и так в порядке.

@ManyToOne
@JoinColumn(name="id_party")
private ProductionParty party;

В моём случае решение было несколько проще и совсем не заметным из кода программы. Я всё объявил верно, но в самой базе неправильно указал тип данных. Varchar(10), который я выбрал опрометчиво, не мог уместить всей строчки, и данные были бы частично утеряны при сохранении. Собственно, об этом и говорило мне сообщение в логе.

Так как удалить столбец MS SQL Server не разрешил, а удалять и создавать таблицу заново я не хотел, я просто добавил в табличку ещё один столбик, но уже с правильным типом данных. И мне пришлось лишь поправить параметр name в скобках возле аннотации @Column

@Column(name="text_new")
private String text;

На сегодня всё, надеюсь мои решения помогли вам исправить ошибку, если вы тоже с ней столкнулись.

1 Comment

Оставить комментарий