Я бы хотел спросить о возможности изменить 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.
Хорошего дня, Спасибо
Привет, М. Дениум. Да правильно. Но когда я создал новый BusinessUser, установил все поля (конечно, установил идентификатор пользователя, где ID = 1) и вызвал метод userRepository.save (businessUser), я получил новую запись с ID = 2
Возможный дубликат Объект обновления Hibernate с родительского класса до дочернего в наследовании JOINED
Спасибо, ребята, но я все еще пытаюсь найти решение для обновления столбца 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
Конечно, новый «id» отличается от оригинального, поскольку исходный представляет собой User, а этот объект не тот. Простое изменение дискриминатора в любом случае неадекватно, поскольку вам также придется вставлять данные в таблицу businessUser (поскольку вы выбрали стратегию JOINED).





Чтобы сделать что-то подобное, я думаю, вы вынуждены использовать собственный запрос. На самом деле я думаю, что это не лучший выбор для использования наследования в изображенной ситуации, но это уже другая история.
Используйте собственный запрос, измените существующие данные, и тогда провайдер JPA обнаружит, что в таблице businessUser нет записи, поэтому в конце концов это не может быть BusinessUser ...
Это просто, вы также добавляете строку в таблицу businessUser
hackety hack hack. Почему они используют JPA, если они это делают?
Как я писал в исходном посте, я бы подумал немного лучше, если бы вообще использовалось наследование. Но если вы хотите решить проблему в данной ситуации, выхода нет, тогда использовать собственные запросы
Вы можете сделать 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, и вам необходимо удалить исходного пользователя, прежде чем сохранять повышенного пользователя.
Конечно, вы не можете преобразовать
UserвBusinessCustomer. Это просто пользователь. Вам нужно будет создать новыйBusinessCustomerи сохранить его (и заполнить его свойствамиUser).