我想构建一个像Udemy这样的示例应用程序。我有3个实体(用户,培训师,管理员)。我试着根据我下面提到的一些条件来申请
- 用户可以付费购买课程(注册)。非用户教员和管理员不能购买培训。
正如我之前所说,我有3个实体和3个存储库。我已经尝试了两种方法来解决它,都成功了,但我无法选择哪一种方法最好。
-
第一种方法是分离实体。通过这样做,当用户存储库中没有用户具有userId时,我可以确定此userId不对应于用户,或者它不是用户(它可以是trainer或admin,或者两者都不是)
-
第二种方式是继承。我创建了一个BaseUser类
public abstract class BaseUser extends BaseEntity {
private String name;
@Enumerated(EnumType.STRING)
private EUserRole role;
}
,我创建了BaseUserRepository, UserRepository, AdminRepository和TrainerRepository继承。
public interface BaseUserRepository<T extends BaseUser> extends JpaRepository<T, UUID> { }
,我已经在注册服务中使用了这个存储库。
User user = baseUserRepository.findById(userId)
.filter(u -> u.getRole() == EUserRole.USER)
.map(u -> (User) u)
.orElseThrow(() -> new RuntimeException("User not found or not authorized"));
你认为我应该用哪种方法?我很困惑……
如果您遵循编程和系统灵活性的原则,那么对于具有共同属性的类似实体,最好有一个父类,在这种情况下,实际上,所有三个实体都是用户,我建议使用基类,因为在将来这可以帮助使系统更灵活(例如,更改用户的密码,更改名称等)