如何知道hibernate中映射的子类

时间:2014-08-14 03:02:58

标签: java hibernate

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class A{

    private long id;
}

@Entity
public class B extends A{

    private String bProperty;
}

@Entity
public class C extends A{

    private String cProperty;
}

@Entity
public class Person{

    @OneToMany
    private Set<A> a;
}

当我使用person.getVehicles

我怎么知道A是B还是C?

我正在使用instanceof来检查并投射它以获得bProperty或cProperty。

还有其他更好的方法吗?

1 个答案:

答案 0 :(得分:0)

唯一安全的方法是使用多态方法。甚至instanceof也不会起作用,因为实例实际上可能是一个代理,即A的子类既不是B也不是C,而是委托给B或C。

public class A{
    private long id;

    public abstract boolean isB();
    public abstract boolean isC();
    public abstract String getBProperty();
    public abstract String getCProperty();
}

public class B extends A{
    private String bProperty;

    public boolean isB() {
        return true;
    }

    public boolean isC() {
        return false;
    }

    public String getBProperty() {
        return bProperty;
    }

    public String getCProperty() {
        throw new IllegalStateException("I'm not a C");
    }
}

为了更清洁,请尝试使用访客模式。我已经写过blog post了。它是法语的,但应该很容易翻译。