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

Posted

技术标签:

【中文标题】DAO 接口:2 个实体(Java、Hibernate)的实现【英文标题】:DAO interface: Implementation for 2 entities (Java, Hibernate) 【发布时间】:2020-06-25 22:12:16 【问题描述】:

我有 2 个实体 Student 和 Intsructor。我想用 Dao 实现为两个实体实现 Dao 接口。我将一个班级用户设置为 Student an Instructor 的父母:

@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;
    

道接口:

public interface DAO 
    List<User> getAllUsers();

    ...


两个实体的 DAO 实现。

但是有一个问题。我无法保存每个实体的所有属性,因为在 User 类中我只有其中的一些。 Student 和 Instructor 除了继承属性外,还有自己的属性。

如何实现 DAO 和实体。在这种情况下有什么好的做法?

谢谢

【问题讨论】:

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

您可以尝试使用泛型。

public interface GenericDAO<T> 
  List<T> getAll();

并且在需​​要的时候,你可以扩展和定义具体的功能。

public interface UserDAO extends GenericDAO<User> 
    User getAllWithAvatar();

希望这会有所帮助!

【讨论】:

以上是关于DAO 接口:2 个实体(Java、Hibernate)的实现的主要内容,如果未能解决你的问题,请参考以下文章

java web spring jpa 在以接口为dao的方法里使用原生sql,联合查找没有对应实体,用啥来接收? 求大神

java中的dao模式

用java实现邮箱的验证以及激活

java开发时为啥要dao和service都是model层吗?

利用MyBatis生成器自动生成实体类DAO接口和Mapping映射文件

Dao层