从 EntityManager.find() 获取子 类

Getting sub-classes from EntityManager.find()

我有一个可以被子class编辑的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 及其所有子对象class共享同一个 ID 字段——每个值对它们都是唯一的。我的问题是,当我像这样在 class 基础上执行 EntityManager.find() 时:

@PersistenceContext protected EntityManager em;

//  find a record.

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

如果 find 方法 return 是子 class 之一,如果它正在使用那个特定的 ID?或者它总是 return 只是一个 BaseClass 对象?

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

EntityManager.find() returns 指定“id”和实体类的类型实例。如果您具有继承并提供超类,并且“id”暗示子类的实例,那么这将 return 子类(多态性)。向表中添加鉴别器的全部原因是允许实现为您提供此类处理。

find() 的 JPA 规范描述(不是他们费心添加太多描述)没有明确说明这种行为,尽管它必须像上面那样做与基本的 JPQL 查询“SELECT b FROM BaseClass b”一致,它将 return 个对象属于该类型的 SubClass 实例。