Вопрос или проблема
Jpa delete и deleteById не работают, в то время как jpa запросы custom delete и deleteAllByIdInBatch работают. Пожалуйста, проверьте код ниже
@Entity
@Table(name = "user")
public class User extends AuditModel<Long> {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "user_id", nullable = false)
private Long userId;
@OneToMany(mappedBy = "user", fetch = FetchType.EAGER, targetEntity = UserRole.class)
private Set<UserRole> userRoles;
@Entity
@Table(name = "user_role")
public class UserRole extends AuditModel<Long> {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "user_role_id")
private Long userRoleId;
@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)
@JoinColumn(name = "user_id")
private User user;
@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)
@JoinColumn(name = "role_id")
private Role role;
Override
public void removeRoles(UserVO userVO) {
User user = userRepository.findByUserId(userVO.getUserId());
user.getUserRoles().forEach(ur -> {
userRoleRepository.delete(aafUserRole.get());
});
}
Перед обновлением jdk 21 и spring boot это работало, после обновления версии spring boot 3.2.5 delete из Spring jpa не работает
Ответ или решение
Проблема с удалением в Spring JPA после обновления до JDK 21 и Spring Boot
Недавно после обновления до JDK 21 и Spring Boot 3.2.5 возникла сложность с методом удаления (delete и deleteById) в Spring JPA, в то время как пользовательские запросы удаления и deleteAllByIdInBatch продолжают работать. Эта проблема может быть вызвана изменениями в работе JPA или зависимостями, связанными с новой версией, которые нарушают ожидаемое поведение. Рассмотрим несколько важных аспектов, которые могут помочь диагностировать и решить данную проблему.
1. Изменения в JDK 21 и Spring Boot 3.2.5
С выходом новых версий JDK и Spring Boot могли быть внесены изменеия, влияющие на функциональность. Важно внимательно изучить release notes для каждой версии, чтобы понять, какие изменения могли затронуть ваши методы удаления. Чаще всего изменения касаются:
- Анализа зависимостей: Убедитесь, что все ваши зависимости совместимы с новой версией Spring Boot.
- Обработки транзакций: В Spring 3.x могли быть изменены внутренние механизмы обработки транзакций, что может влиять на методы, которые вызывают удаление сущностей.
2. Проверка методов удаления
Ваш код для удаления ролей пользователя выглядит следующим образом:
user.getUserRoles().forEach(ur -> {
userRoleRepository.delete(aafUserRole.get());
});
Чтобы выявить проблему, убедитесь, что:
-
Проверка на null: добавьте проверки на наличие сущности перед удалением. Убедитесь, что
ur
не равен null и правильно загружается из базы данных. -
Транзакционность: Убедитесь, что метод, в котором вызывается код удаления, аннотирован
@Transactional
. Это необходимо, чтобы изменения сохранялись в базе данных. Если метод вызывается из другого метода, аннотированного@Transactional
, это также может вызвать проблемы.
Пример исправленного кода:
@Override
@Transactional
public void removeRoles(UserVO userVO) {
User user = userRepository.findByUserId(userVO.getUserId());
if (user != null && user.getUserRoles() != null) {
user.getUserRoles().forEach(ur -> {
if (ur != null) {
userRoleRepository.delete(ur);
}
});
}
}
3. Логирование и отладка
Для диагностики проблем с удалением следует включить логирование SQL-запросов, чтобы убедиться, что запросы действительно выполняются. В application.properties
добавьте следующее:
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
Это позволит увидеть формируемые запросы и ошибки, возникающие при их выполнении.
4. Проверка конфигурации JPA и Hibernate
Некоторые конфигурации JPA могут потребовать доработки. Убедитесь, что настройки для Hibernate правильно установлены для работы с новой версией:
spring.datasource.url=jdbc:mysql://localhost:3306/your_db
spring.datasource.username=your_username
spring.datasource.password=your_password
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect
Заключение
Проблема с методами delete и deleteById в Spring JPA после обновления до JDK 21 и Spring Boot 3.2.5 может быть вызвана рядом факторов, включая изменения в JPA, зависимости и конфигурацию приложения. Рекомендуется проверить логи, обновить код с учетом новых версий, а также протестировать транзакционность методов. С выполнением этих действий вы сможете разобраться с возникшей проблемой и восстановить корректную работу методов удаления в вашем приложении.