我使用Hibernate和3.6以及Spring Data JPA 1.5。我有一个上层阶级:
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class Mother{
private long id;
// constructor, others attributes and accessors
}
@Entity
public class FirstSubClass extends Mother{
private String specificFirstSubClassNotNull;
// constructor, others attributes and accessors
}
@Entity
public class SecondSubClass extends Mother{
private String specificSecondSubClassNotNull;
// constructor, others attributes and accessors
}
我使用spring数据jpa从数据库中获取数据,我想得到所有的Mother对象。我能够从数据中获取数据。 Spring数据jpa返回给我一份母亲列表(列出母亲。所以我想知道哪个是哪个子类最好的解决方案? 这是第一个解决方案:
for(Mother mother : mothers){
if(mother instanceof FirstSubClass){
System.out.println("This is a FirstSubClass instance");
}else if(mother instanceof SecondSubClass){
System.out.println("This is a SecondSubClassinstance");
}
}
或第二个解决方案:
for(Mother mother : mothers){
if(mother.getSpecificFirstSubClassNotNull!=null){
System.out.println("This is a FirstSubClass instance");
}else if(getSpecificSecondSubClassNotNull!=null){
System.out.println("This is a SecondSubClassinstance");
}
}
我认为上述情况并不好。你会怎么做 ?任何提议都受到欢迎。 感谢
答案 0 :(得分:0)
需要降级来应用某种行为才是代码嗅觉。毕竟你使用继承是有充分理由的,因此你应该利用OOP提供的优势:多态。
您的域模型不必是其关联数据库表的贫血一对一镜像。您可以向您的实体添加域逻辑,这就是您应用特定于类型的行为的方式。
假设您有以下层次结构:
public class Mother {
@Transient
public String getNickName() {
return "Mama " + this.name;
}
}
public class GrandMother extends Mother {
@Transient
@Override
public String getNickName() {
return "Grandma " + this.name;
}
}
public class GreatGrandMother extends GrandMother {
@Transient
@Override
public String getNickName() {
return "Greatma " + this.name;
}
}
当您获取Mother实体列表时,您可以简单地调用基类方法并依赖多态来获取特定类型行为:
List<Mother> mothers = ...
for(Mother mother : mothers) {
LOGGER.info(mother.getNickName());
}