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);
}