Почему CrudRepository игнорирует @Column?

#java #spring #intellij-idea

#java #весна #intellij-идея

Вопрос:

У меня есть объектная модель, которая выглядит следующим образом:

 public class Agreement {
    @Id @Column(name = "AGREEMENT_ID") private String agreementId;

    @Column(name = "RATE") private String rate;
    @Column(name = "NOTE") private String note;
    ... // A number of other fields
}
  

У каждого поля есть геттеры и сеттеры, сгенерированные IntelliJ, проверено, что все они верны. В моем графическом интерфейсе пользователя есть возможность внести изменения в соглашение, затем нажать «Сохранить». Теперь моему серверу необходимо выполнить обновление на серверной части. Я использую репозитории Spring, и поэтому у меня есть:

 @Repository
public interface AgreementRepository extends CrudRepository<Agreement, String> {}
  

Когда пользователь выполняет отправку, я вызываю agreementRepository.save(agreement) . Однако одно из моих полей rate не обновляется на серверной части.

Я прошел через код и проверил, что rate свойство правильно установлено в agreement передаваемом объекте save() . Кроме того, я распечатал SQL и убедился, что проблема, похоже, возникает именно на этом уровне, отметив, что save() метод вызывает a, за которым SELECT следует, UPDATE как и ожидалось, поскольку я снова и снова изменяю одну и ту же запись при тестировании, но я ясно вижу в той UPDATE части запроса, котораяполе rate не устанавливается.

Что еще более странно, ВСЕ остальные поля задаются правильно, независимо от того, задаю я также RATE или нет. Все остальные изменения распространяются просто отлично. В этом поле нет ничего необычного RATE . Я подумал, что, возможно, был плохой триггер или что-то, что ввел разработчик до меня, но я вижу, что UPDATE SQL, сгенерированный Spring, явно не устанавливает его, и проверил, что таких триггеров не существует.

В чем причина, по которой CrudRepository.save() игнорируется одно из моих полей? Он не отмечен @Transient и никоим образом не является необычным. Если это не CrudRepository так, где еще я должен посмотреть, почему это поле задано неправильно?

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

1. Какую базу данных вы используете? Вы проверили, что столбец «RATE» существует в базе данных?

2. Итак, другие столбцы обновляются и оцениваются, не так ли? У вас есть @transactional аннотация?

3. Столбец RATE существует, является VARCHAR(128) (более чем достаточным) и есть nullable . Я попытался пометить вызывающий метод as @Transactional , и это дало тот же эффект. Но да, другие столбцы обновляются просто отлично.

4. какую реализацию spring data вы используете? Если вы используете JPA, то я считаю, что за генерацию запросов отвечает базовый entitymanager (т. е. hibernate), а не CrudRepository . Некоторые из entitymanagers будут знать, действительно ли поле изменилось, и обновляют только те поля, которые изменились. Даже если вызывается установщик, но заданное значение эквивалентно старому значению, вполне вероятно, что он не выполнит операцию обновления для этого поля. Однако я подозреваю, что это не относится к вам.

5. @loesak Я использую JPA, несмотря на это, я отмечаю, что эти изменения происходят просто отлично в других полях, и далее я изменяю значение этого поля от теста к тесту, поэтому, даже если по какой-то причине оно находится в отключенном состоянии и не сравнивается с базой данных, что бы это ни былов памяти также должно быть по-другому. Возиться с изменением имени поля сейчас

Ответ №1:

Вот действительно дикая часть. Кажется, моя проблема была решена путем перезапуска IntelliJ. Действительно трудно понять, что пошло не так.

Я начал с переименования столбца в БД на что-то другое, но оставил все остальные конфигурации неизменными. Я отметил, что исключение не генерируется, и попытался выяснить, почему, весенний репозиторий должен кричать на меня за неправильно настроенные объекты. После еще нескольких странных случаев я подумал, что было бы лучше перезапустить IntelliJ, на всякий случай.

Внезапно он правильно подобрал столбец с неправильным именем. Я переименовал столбец обратно в то, каким он должен быть, и все работает так, как ожидалось. Действительно странно.