从 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 实例。
我有一个可以被子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 实例。