【问题标题】:Java inheritance of Hibernate EntitiesHibernate 实体的 Java 继承
【发布时间】:2019-10-15 17:22:39
【问题描述】:

背景: 我正在构建一个 Web 应用程序,允许教师使用许多分析功能对学生进行测验,以帮助衡量个人/班级在测试/测验中的表现。目前,我正在重新设计 MySQL DB Schema,您可以看到我迄今为止构建的基本 EEF 图:

我实际上是在使用 Hibernate 来创建从后端到数据库的连接,但是这个 EEF 图在显示表之间的关系方面做得很好。

问题 我目前为 Admins、Student 和 Teachers 设置了单独的表,因为这三个表都将具有唯一的字段,尽管目前它们具有非常相似的字段。拥有 3 个不同的表的问题是我希望教师和学生共享一些功能。例如,教师应该能够像学生一样参加测验(出于测试目的)。 我的第一直觉是创建一个学生和教师都扩展的用户类:

 public class User{
...
}
@Entity
@Table(name="student")
public class Student extends User{
...
}
@Entity
@Table(name="teacher")
public class Teacher extends User{
...
}

这种方法完成了我想做的测验服务:

public QuizInstance takeQuiz(User u, QuizStructure struct){
...
}

但我不确定在涉及多态性时如何创建映射关系。这个问题的一个很好的例子是 registerUser 服务:

public void registerUser(User u, String password) {
        if(u instanceof Teacher) {
            //register User into Teacher Table..
        }else if(u instanceof Student) {
            //register User into Student Table...
        }
        new LoginService().createLogin(u, password);
    }
public class LoginService{
    ...
    public void createLogin(User u, String password){
        Login l = new Login();
        l.setEncrPass(encrypt(password));
        l.setEmail(u.getEmail());
        if(u instanceof Teacher)
            l.setRole("teacher");
        else
            l.setRole("student");
        l.setUser(u);

        //Save Login into Login Table in DB
    }
}
@Entity
@Table(name="login")
public class Login {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="user_id", unique=true, nullable=false)
    private int id;

    @Column(name="email", nullable=false)
    private String email;

    @Column(name="encrypted_pass", nullable=false)
    private String encryptedPass;

    @Column(name="role", nullable=false)
    private String role;

    //How do I map User if it can link to either the Teacher table or the Student Table???
    private User user;
}

我质疑这是否是解决问题的最佳方法。我不禁动摇我的 DB Schema 的设计是一个问题,安全性和结构方面。有人可以告诉我我构建的数据库架构是否工艺不佳,如果是,请分享一些示例/资源,以更好地帮助说明更安全的数据库架构。

【问题讨论】:

    标签: java mysql hibernate inheritance architecture


    【解决方案1】:

    这里有一些建议,

    • 此方案需要基本的 RBAC(基于角色的访问控制)。
    • 所有用户,即学生、教师、管理员等本质上都是系统用户,他们都需要登录。
    • 因此,您需要一个表来定义一组角色,即管理员、教师、学生等。
    • 对于所有用户,一个用户表就足够了。该用户表将具有 Role 作为属性。
    • 出于安全考虑,即检查用户是否被允许访问给定资源或执行操作可以通过检查其角色来完成。例如。管理员将有权访问教师和学生无法访问的某些页面/操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-11
      • 2021-02-21
      • 1970-01-01
      • 2016-03-31
      • 2019-07-13
      • 2016-11-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多