如何更改实体的DiscriminatorValue

时间:2018-07-31 10:06:02

标签: hibernate spring-boot jpa spring-data-jpa entity

我会问您有关改变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> {
    }

首先,我创建了一个简单的用户。该实体具有user_type CUSTOMER。然后,我想扩展该实体并将其修改为BusinessCustomer。当我尝试执行以下操作时:查找用户实体并将其强制转换为businessUser实体,我得到了IllegalCastException。我无法将用户转换为BusinessUser。

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

今天过得愉快, 谢谢

2 个答案:

答案 0 :(得分:0)

要做这样的事情,我认为您被迫使用本机查询。  实际上,我确实认为在所示情况下使用继承不是最佳选择,但这是另一回事了。

答案 1 :(得分:-1)

您可以创建一个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);
}

如果要提升的用户仍然具有原始ID,则请勿使用@GeneratedValue,并且您需要先删除原始用户,然后再保存提升的用户。