Данные пружины, Oracle DB, java. sql .SQLException: Numeri c переполнение - PullRequest
0 голосов
/ 15 января 2020

В моем приложении (Oracle DB [11g], данные Spring, Java 8) я сопоставил свою сущность с идентификатором, подобным этому:

@Column(name = "MYID")
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "MY_SEQUENCE")
@SequenceGenerator(sequenceName = "MY_SEQUENCE", allocationSize = 1, name = "MY_SEQUENCE")
private Integer     id;

В столбце oracle введите НОМЕР (38,0)

Для некоторых данных, когда я пытаюсь найтиById, приложение выдает: SQL Ошибка: 17026, SQLState: null - Numeri c Переполнение.

I попытался изменить тип моего java объекта, такого как long, BigDecimal и BigInteger, но я получил исключение Integer преобразования из Hibernate.

Я не могу изменить определение таблицы в базе данных.

Как можно решить эту проблему?

Спасибо

1 Ответ

0 голосов
/ 19 января 2020

Вы никогда не должны использовать тип данных Integer, если тип данных столбца базы данных определен как NUMBER(38,0), так как этот формат может хранить гораздо большие числа, чем с одинарной точностью Integer.

Более безопасный должен использовать Long, который охватывает целые числа двойной точности. Чтобы увидеть, находятся ли ваши данные в диапазоне, охватываемом Long, выполните этот запрос (подставьте имена таблиц и столбцов)

select AGE from author_tab 
where not (-power(2,63) <= AGE and AGE <= power(2,63)-1)

Если данные не возвращены, вы на безопасной стороне Long

В качестве крайней меры используйте BigInteger, который можно точно обрезать до типа данных вашей базы данных

@Column(precision=38, scale=0)
BigInteger age
...