Как я могу изменить DiscriminatorValue объекта

Я бы хотел спросить о возможности изменить DiscriminatorValue на какие-то энтыты. Например, у меня есть 2 объекта:

    @Entity
    @Table(name = "user")
    @Inheritance(strategy=InheritanceType.JOINED)
    @DiscriminatorColumn(name = "user_type")
    @DiscriminatorValue("CUSTOMER")
    public class User

а также

    @Entity
    @Table(name = "businessUser")
    @DiscriminatorValue("FOUNDER")
    public class BusinessUser extends User

У меня есть репо:

    @NoRepositoryBean
    public interface UserBaseRepository<T extends User>  extends JpaRepository<User, Long> {

    T findByEmail(String email);
    }

    @Transactional
    @Repository("UserRepository")
    public interface UserRepository extends UserBaseRepository<User> {
    }

    @Transactional
    @Repository("BusinessUserRepository")
    public interface BusinessUserRepository extends UserBaseRepository<BusinessUser> {
    }

Сначала я создал простого пользователя. У этой сущности тип_пользователя CUSTOMER. Затем я хотел бы расширить эту сущность и изменить ее на BusinessCustomer. Когда я пытался сделать следующее: найти объект пользователя и преобразовать его в объект businessUser, я получил исключение IllegalCastException. Я не могу преобразовать пользователя в BusinessUser.

Помогите мне, пожалуйста, как я могу изменить user_type или или обновить пользователя на businessUser.

Хорошего дня, Спасибо

Конечно, вы не можете преобразовать User в BusinessCustomer. Это просто пользователь. Вам нужно будет создать новый BusinessCustomer и сохранить его (и заполнить его свойствами User).

M. Deinum 31.07.2018 12:24

Привет, М. Дениум. Да правильно. Но когда я создал новый BusinessUser, установил все поля (конечно, установил идентификатор пользователя, где ID = 1) и вызвал метод userRepository.save (businessUser), я получил новую запись с ID = 2

Ddrad 31.07.2018 12:36

Спасибо, ребята, но я все еще пытаюсь найти решение для обновления столбца DTYPE. У меня есть DiscriminatorValue, я не могу иметь его в моем объекте. Поэтому я не могу использовать что-то вроде: code @Modifying @Query ("update User u set u.user_type =: userType where u.id =: userId") void changeUserType (@Param ("userType") String userType, @Param (" userId ") длинный userId); code

Ddrad 31.07.2018 14:08

Конечно, новый «id» отличается от оригинального, поскольку исходный представляет собой User, а этот объект не тот. Простое изменение дискриминатора в любом случае неадекватно, поскольку вам также придется вставлять данные в таблицу businessUser (поскольку вы выбрали стратегию JOINED).

user3973283 31.07.2018 14:21
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
1 340
2

Ответы 2

Чтобы сделать что-то подобное, я думаю, вы вынуждены использовать собственный запрос. На самом деле я думаю, что это не лучший выбор для использования наследования в изображенной ситуации, но это уже другая история.

Используйте собственный запрос, измените существующие данные, и тогда провайдер JPA обнаружит, что в таблице businessUser нет записи, поэтому в конце концов это не может быть BusinessUser ...

user3973283 31.07.2018 16:16

Это просто, вы также добавляете строку в таблицу businessUser

Giorgio D. 31.07.2018 16:29

hackety hack hack. Почему они используют JPA, если они это делают?

user3973283 31.07.2018 16:29

Как я писал в исходном посте, я бы подумал немного лучше, если бы вообще использовалось наследование. Но если вы хотите решить проблему в данной ситуации, выхода нет, тогда использовать собственные запросы

Giorgio D. 31.07.2018 16:40

Вы можете сделать Service, где вы можете продвигать своего пользователя ...

public BusinessUser promote(User user) {
    BusinessUser businessUser = new BusinessUser();
    businessUser.setId(user.getId());
    businessUser.setEmail(user.getEmail());
    userRepository.delete(user);
    return businessUserRepository.save(businessUser);
}

Если вы хотите, чтобы повышенный пользователь по-прежнему имел исходный идентификатор, тогда НЕ использует @GeneratedValue, и вам необходимо удалить исходного пользователя, прежде чем сохранять повышенного пользователя.

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