Обновить объект с помощью Hibernate, единственное поле которого доступно для редактирования в DB

#java #spring #oracle #hibernate #jpa

#java #spring #Oracle #гибернация #jpa

Вопрос:

У меня есть продукт класса entity, который мне был предоставлен для чтения для всего объекта и обновления ТОЛЬКО для поля цены в базе данных. Поэтому всякий раз, когда я вызываю productDao.update(product), даже если я изменил только значение поля price, я получаю

 <2020-09-17 14:33:26.735  WARN 26939 --- [ (self-tuning)'] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 1031, SQLState: 42000> 
<2020-09-17 14:33:26.735 ERROR 26939 --- [ (self-tuning)'] o.h.engine.jdbc.spi.SqlExceptionHelper   : ORA-01031: insufficient privileges> 
<2020-09-17 14:33:26.736  INFO 26939 --- [ (self-tuning)'] o.h.e.j.b.internal.AbstractBatchImpl     : HHH000010: On release of batch it still contained JDBC statements> 
<2020-09-17 14:33:26.737 ERROR 26939 --- [ (self-tuning)'] o.h.i.ExceptionMapperStandardImpl        : HHH000346: Error during managed flush [org.hibernate.exception.SQLGrammarException: could not execute statement]> 
  

Комментарии:

1. Ну, вы могли бы попытаться обновить это поле с помощью JPQL / HQL или сделать любое другое свойство вашего объекта свойством, доступным только для чтения.

Ответ №1:

Попробуйте использовать динамическое обновление, сгенерированный SQL попытается обновить только те столбцы, которые были изменены

Ответ №2:

Может быть, вместо вызова метода default .update() реализуйте свой собственный метод обновления, в котором вы просто выполняете оператор обновления HQL, который обновляет одно поле на основе значения вашего объекта?

Ответ №3:

Может быть, вы могли бы попытаться аннотировать другие свойства объекта как @Column(обновляемый = false)