#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, на всякий случай.
Внезапно он правильно подобрал столбец с неправильным именем. Я переименовал столбец обратно в то, каким он должен быть, и все работает так, как ожидалось. Действительно странно.