要解决的Hibernate JPA方案?

时间:2018-10-30 20:07:54

标签: spring hibernate spring-boot jpa hibernate-mapping

有一名班级顾问。顾问可以有许多经验,例如受薪,自雇,自由职业者。对于每种类型的体验,都有不同的数据要保存在数据库中。

Salaried:

总经验
公司名称
几年的体验时间 录取通知书链接

自雇人士:

公司名称
总体经验
CIN_Number
GST_Number
CompanyCertificateLinkUrl

FreeLancer:

总经验

用户可以具有多种职业类型的经验,例如顾问既是受薪又是自由职业者,或者是自雇人士加上受薪和自由职业者。所以我很困惑如何为这种用例制作@Entity类。

  

我的解决方案

@Entity
class Consultant{

@Id
int id;

@OneToOne
Salaried semp;

@OneToOne
SelfEmployed selfemp;

@OneToOne
Freelancer femp;
}

但是我认为这不是一个好习惯,因为它会导致数据库中出现许多空字段。

更好的解决方案

2 个答案:

答案 0 :(得分:0)

您可以使用两个类 consultant profession (id,名称)以及关系OneToMany,{{ 1}}

顾问的实体

ManyToOne

专业的实体

@Entity
class Consultant{

    @Id
    private int id;

    @OneToMany(mappedBy = "consultant",cascade = CascadeType.All)
    List<ConsultantProfession> cp;

}

顾问职业的实体

@Entity
class Profession{

    @Id
    private int id;

    private String name;

    @OneToMany(mappedBy = "profession", cascade = CascadeType.All)
    private List<ConsultantProfession> cp;

}

答案 1 :(得分:0)

我认为您的方法很好。 @OneToOne字段在默认情况下是可选的,因此可以为null。这意味着相应的表中将没有行,因此,顾问表中每行最多只有两个空值。

如果您真的很担心数据库中的null,那么可以用另一种方式映射关系,所以:

@Entity
class Consultant{

    @Id
    int id;

    @OneToOne(mappedBy = "consultant")
    Salaried semp;

    @OneToOne(mappedBy = "consultant")
    SelfEmployed selfemp;

    @OneToOne(mappedBy = "consultant")
    Freelancer femp;
}

这样,如果Salaried表中没有与顾问相关的行,则semp对象中的Consultant字段将为空。