Hibernate继承:如何知道查询返回的子类?

时间:2014-08-07 09:17:35

标签: java spring hibernate jpa

我使用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");
}

}

我认为上述情况并不好。你会怎么做 ?任何提议都受到欢迎。 感谢

1 个答案:

答案 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());    
}