Пользователь не может быть удален из базы данных

Цель состоит в том, чтобы проверить и удалить карту пользователя при ее удалении, при условии, что она больше не используется. Это формат удаления пользователя:

@Transactional
public void deleteUserById(long userId) {
    User user = userRepository.findById(userId);
    if (user == null) {
        throw new IllegalArgumentException("User with id " + userId + " not found");
    }
    userRepository.deleteById(userId);
}

В этом формате пользователь удаляется только при выполнении условия «если», то есть когда карта принадлежит исключительно удаляемому пользователю. Однако если карта принадлежит более чем одному пользователю, код выполняется корректно, но пользователь не удаляется из базы данных. В чем может быть причина этого?

@Transactional
public void deleteUserById(long userId) {
    User user = userRepository.findById(userId);
    if (user == null) {
        throw new IllegalArgumentException("User with id " + userId + " not found");
    }
    if (userBankCardService.checkBankCardUsers(user.getUserBankCard().getCardNumber()) == 1) {
        userBankCardService.deleteBankCard(user.getUserBankCard().getCardNumber());
    }
    userRepository.deleteById(userId);
}

Если это важно, вот мои сущности.

@Entity
@AllArgsConstructor
@NoArgsConstructor
@Data
@Builder
@ToString(exclude = "users")
@Table(name = "users_bank_cards")
public class UserBankCard {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
    @Column(name = "card_number")
    private long cardNumber;
    @Column(name = "cvv")
    private short cvv;
    @Column(name = "card_expiration_date")
    private String cardExpirationDate;
    @OneToMany(mappedBy = "userBankCard", cascade = CascadeType.ALL)
    @JsonIgnore
    private List<User> users = new ArrayList<>();
}

 @Entity
 @AllArgsConstructor
 @NoArgsConstructor
 @Data
 @Builder
 @ToString(exclude = {"subscription"})
 @Table(name = "users")
 public class User {
     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     private long id;
     @Column(name = "phone_number")
     private long phoneNumber;
     @Column(name = "password")
     private String password;
     @Column(name = "auto_renew")
     @Enumerated(EnumType.STRING)
     private AutoRenewStatus autoRenew;
     @Column(name = "end_time")
     private LocalDateTime endTime;
     @Column(name = "email")
     private String email;
     @ManyToOne
     @JoinColumn(name = "bank_card_id")
     private UserBankCard userBankCard;
     @ManyToOne
     @JoinColumn(name = "subscription_id")
     private Subscription subscription;
 }

Как удалить пользователя, если карту удалять не обязательно?

Если нет юридического требования, всегда лучше пометить что-то как неактивное, чем удалять. Данные – золото

g00se 05.06.2024 15:39

Полностью согласен с @g00se. Создайте новый столбец в таблице БД, указывающий, что он заархивирован в логическом состоянии. Это гарантирует, что что-то будет удалено по ошибке.

djmonki 05.06.2024 15:41

@djmonki, конечно, означает, что это гарантирует, что что-то НЕ будет удалено по ошибке.

g00se 05.06.2024 15:44

Или вместо BOOLEAN используйте столбец типа, подобного стандартному типу SQL TIMESTAMP WITH TIME ZONE, чтобы указать, была ли и когда строка «удалена» (инактивирована).

Basil Bourque 05.06.2024 15:46

@g00se - спасибо, что заметили ошибку в моем комментарии

djmonki 05.06.2024 15:53
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
5
51
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

Не обратил внимания на кеширование Hibernate. После удаления пользователя из списка пользователей кредитных карт, пользователь также удаляется из базы данных.

Другие вопросы по теме