DAO接口:2个实体(Java、Hibernate)的实现

DAO接口:2个实体(Java、Hibernate)的实现,java,hibernate,inheritance,orm,dao,Java,Hibernate,Inheritance,Orm,Dao,我有两个实体:学生和教师。我想用两个实体的Dao实现实现Dao接口。我将一个班级用户设置为学生和讲师的家长: @MappedSuperclass public abstract class User { @Id @GeneratedValue(strategy= GenerationType.IDENTITY) @Column(name="id") private int id; @Column(name = "name") private

我有两个实体:学生和教师。我想用两个实体的Dao实现实现Dao接口。我将一个班级用户设置为学生和讲师的家长:

@MappedSuperclass 
public abstract class User {

    @Id
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    @Column(name="id")
    private int id;

    @Column(name = "name")
    private String firstName;

    @Column(name = "password")
    private String password;

    @Column(name = "email")
    private String email;

    getters and setters ...

}
还有孩子。学生

@Entity 
@Table(name = "student", schema="els")
public class Student extends User {
    @Column(name="achiev")
    private String achievment;      


   public Student() {
   }

   getter and setter for achievment

}
老师呢

@Entity
@Table(name = "instructor", schema="els")
public class Instructor extends User {

    @Column(name = "reputation")
    private int reputation;

    public Instructor() {
    }

    public int getReputation() {
        return reputation;
    }

    public void setReputation(int reputation) {
        this.reputation = reputation;
    }
}
Dao接口:

public interface DAO {
    List<User> getAllUsers();

    ...

}
公共接口DAO{
列出getAllUsers();
...
}
使用两个实体的DAO实现

但有一个问题。我不能保存每个实体的所有属性,因为在用户类中我只有其中的一些属性。学生和教师除了继承财产外,他们还有自己的财产

如何实现道和实体。在这种情况下,什么是好的做法


谢谢

您可以尝试使用泛型

public interface GenericDAO<T> {
  List<T> getAll();
}
公共接口GenericDAO{
List getAll();
}
需要时,您可以扩展和定义特定的函数

public interface UserDAO extends GenericDAO<User> {
    User getAllWithAvatar();
}
公共接口UserDAO扩展了GenericDAO{
用户getAllWithAvatar();
}

希望这有帮助

您应该为每个实体创建一个DAO。为什么?稍后您可能需要
Student
的一些特定功能,因此您只需修改Student DAO。这将更容易创建测试,使您的代码更干净,更小等。感谢您的回答塞巴斯蒂安。这意味着,即使我有20个实体,我也应该为所有实体创建20个DAO接口和20个实现?不太可能,当你有这么多实体时,有一些很好的选择,比如使用泛型。好的,谢谢。我将尝试使用泛型。