[英]Polymorphism and tree structre
在问了以下问题之后: rest api和多态性
我想知道我的整个数据库架构和类结构是否错误。 当前的结构是:
在db中,表中为每个子类型组织的表
我想到了可能重构类,因为子类没有添加任何有价值的字段,除了为此添加的孩子/父母列表之外,只有一个包含所有字段的类:
@Entity
class Person{
@ManyToOne
private Person parent; //parent==null is a grandparent
@OneToMany
private List<Person> children;
}
但是,这样做的问题是,在我的业务逻辑中,父母子女和祖父母的确有不同的行为,因此更难以区分父母子女不能是祖父母。
另一个问题是,例如我坚持使用当前的类结构
分离类并没有真正帮助我,因为我正在使用服务层
而且我无法确定我需要哪个服务类,例如:
class PeopleController extends Controller {
public Result savePerson() {
Person p = objectMapper.readValue.. // deseralizes to correct subtype
// saving logic is different for each subtype, hence I need to
// find correct repository for this subtype but I don't want to use
// instance of or switch case, but to use polymorphism, but can't think
一种不执行我不想要的活动记录的方法}}
类型的确定可以完全根据状态来确定,并且不需要使用多态性,因为您的问题首先没有提供使用它的任何实际依据。 您定义为收集的属性对于所有Person
似乎都是合理的。
Parent
是包含非空子集的任何人。 Person
实例都构成一个Child
,但是对于本练习,这可能意味着任何包含空子集的人。 GrandParent
是任何人这是一个Parent
,还要求它在儿童组实例中的至少一个是Parent
。 考虑到这一点,我们可以考虑如下重组数据模型。
@Entity
public class Person {
@Id
@GeneratedValue
private Integer id;
private String name;
private Integer age;
// any person can have this, not just children imo :)
private String favoriteShow;
@OneToMany(mappedBy = "parent")
private Set<Person> children;
@ManyToOne
private Person parent;
@Transient
public boolean isChild() {
return children == null || children.isEmpty();
}
@Transient
public boolean isParent() {
return !isChild();
}
@Transient
public boolean isGrandParent() {
return isParent()
&& children.stream().filter( Person::isParent ).count() > 0;
}
}
即使采用这种方法,您的逻辑也可以基于布尔瞬态方法检查进行分支。 当然,有很多方法可以优化这些方法,但是我不会太担心,因为这些检查已经在JDK8上进行了优化。
不过,这样做的好处是,您可以简单地让控制器与之交互的Person
服务,并且很有可能是Person
存储库,因为数据是一种类型。
我知道您的保存逻辑因类型而异,但是我的问题是它真的必须有所不同吗? 也许需要对这些原因进行分解的更深入的推理可以为我们提供更多的背景信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.