Hibernate 如何更改实体的鉴别器值

Hibernate 如何更改实体的鉴别器值,hibernate,spring-boot,jpa,spring-data-jpa,entity,Hibernate,Spring Boot,Jpa,Spring Data Jpa,Entity,我想问一下你们是否有机会改变鉴别器的价值。例如,我有两个实体: @Entity @Table(name = "user") @Inheritance(strategy=InheritanceType.JOINED) @DiscriminatorColumn(name = "user_type") @DiscriminatorValue("CUSTOMER") public class User 及 我有回购协议: @NoRepositor

我想问一下你们是否有机会改变鉴别器的价值。例如,我有两个实体:

    @Entity
    @Table(name = "user")
    @Inheritance(strategy=InheritanceType.JOINED)
    @DiscriminatorColumn(name = "user_type")
    @DiscriminatorValue("CUSTOMER")
    public class 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> {
    }
@NoRepositoryBean
公共接口UserBaseRepository扩展了JpaRepository{
T findByEmail(字符串电子邮件);
}
@交易的
@存储库(“用户存储库”)
公共接口UserRepository扩展了UserBaseRepository{
}
@交易的
@存储库(“BusinessUserRepository”)
公共接口BusinessUserRepository扩展了UserBaseRepository{
}
起初,我创建了简单的用户界面。此实体具有用户类型客户。然后我想扩展该实体并将其修改为BusinessCustomer。当我尝试执行以下操作:查找用户实体并强制转换为businessUser实体时,我得到了非法CastException。我无法将用户转换为业务用户

请帮助我,如何更改用户类型或将用户更新为businessUser

祝你今天愉快,
感谢这样做,我认为您必须使用本机查询。
事实上,我确实认为在所描述的情况下使用继承不是最好的选择,但那是另一回事

你可以做一个
服务
,在那里你可以推广你的用户

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

如果希望升级用户仍具有原始ID,则不要使用
@GeneratedValue
,您需要在保存升级用户之前删除原始用户

当然,您不能将
用户
强制转换为
业务客户
。它只是一个用户。您必须创建一个新的
BusinessCustomer
,并将其保存(并用
用户的属性填充)。嗨,M.Denium。是的,对。但是,当我创建新的BusinessUser时,设置所有字段(当然是从ID=1的user设置ID)并调用一个方法userRepository.save(BusinessUser)我得到一个ID=2的新记录,可能是Thanks guys的重复项,但我仍然试图找到更新DTYPE列的解决方案。我有鉴别器值,但我的实体中不能有它。所以我不能使用这样的东西:
code
@Modifying@Query(“update User u set u.User\u type=:userType,其中u.id=:userId”)void changeUserType(@Param(“userType”)String userType,@Param(“userId”)long userId)
code
当然,新的“id”与原来的不同,因为原来的id代表一个
用户,而这个对象不是那个用户。无论如何,仅仅修改鉴别器是不够的,因为您还必须将数据插入表
businessUser
(因为您选择了联接策略)。使用本机查询,对现有数据进行bastardise,然后JPA提供商发现
businessUser
表中没有条目,因此它不可能是
businessUser
毕竟……这很简单,您还可以在businessUser表hackty hack中添加一行。如果他们这样做,为什么要使用JPA?正如我在原始帖子中所写的,如果使用继承,我会觉得更好一些。但是,如果您想在给定的情况下解决问题,那么就没有办法使用本机查询了
public BusinessUser promote(User user) {
    BusinessUser businessUser = new BusinessUser();
    businessUser.setId(user.getId());
    businessUser.setEmail(user.getEmail());
    userRepository.delete(user);
    return businessUserRepository.save(businessUser);
}