从EntityManager.find()获取子类

时间:2016-01-01 20:27:24

标签: hibernate jpa eclipselink jpa-2.0

我有一个可以分类的JPA实体,定义如下:

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "IDTYPE",
    discriminatorType = DiscriminatorType.STRING,
    length = 12)
public class BaseObject implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    //etc

这样做的好处是 BaseObject 及其所有子类共享相同的ID字段 - 每个值对所有这些都是唯一的。我的问题是当我在基类上执行 EntityManager.find()时:

@PersistenceContext protected EntityManager em;

//  find a record.

BaseObject obj = em.find(BaseObject.class, longIDValue);

如果使用该特定ID, find 方法是否会返回其中一个子类?或者它总是会返回 BaseClass 对象?

后续问题:这种行为在不同的JPA实现中是否一致? (例如Hibernate与EclipseLink)

1 个答案:

答案 0 :(得分:2)

EntityManager.find()返回指定" id "的类型实例和entityClass。如果你有继承并提供超类和" id "暗示一个子类的实例然后这将返回子类(多态)。将限制符号添加到表中的全部原因是允许实现为您提供此类处理。

find()的JPA规范描述(并不是他们在添加更多描述时)并没有明确声明这种行为,尽管它必须如上所述与基本JPQL一致查询" SELECT b FROM BaseClass b"它将返回一个对象属于该类型的SubClass实例。