Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 从EntityManager.find()获取子类_Hibernate_Jpa_Eclipselink_Jpa 2.0 - Fatal编程技术网

Hibernate 从EntityManager.find()获取子类

Hibernate 从EntityManager.find()获取子类,hibernate,jpa,eclipselink,jpa-2.0,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 st

我有一个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);
如果find方法使用特定的ID,它会返回其中一个子类吗?或者它总是只返回一个基类对象

后续问题:在不同的JPA实现中,这种行为是否一致?e、 g.Hibernate vs.EclipseLink

EntityManager.find返回指定id和entityClass的类型实例。如果您有继承并提供了超类,并且id暗示了子类的实例,那么这将返回子类多态性。将鉴别器添加到表中的全部原因是为了允许实现为您提供此类处理

JPA规范中对find not The fould add more description的描述没有明确说明这种行为,尽管必须如上所述才能与基本JPQL查询保持一致,但请从基类b中选择b,它将返回子类的实例,其中对象属于该类型。

EntityManager.find返回指定id和entityClass的类型实例。如果您有继承并提供了超类,并且id暗示了子类的实例,那么这将返回子类多态性。将鉴别器添加到表中的全部原因是为了允许实现为您提供此类处理


JPA spec对find not that他们费心添加很多描述的描述并没有明确说明这种行为,尽管它必须如上所述,以与基本JPQL查询SELECT b FROM BaseClass b保持一致,该查询将返回子类实例,其中一个对象属于该类型。

当您这样做时会发生什么?当我使用DataNucleus JPA执行此操作时,我得到了正确的类型。。。i、 e可以是子类。就像JPA一样spec@NeilStockton我的应用程序有问题,所以我还没有测试。但即使它起作用,我也希望确保我没有做依赖于实现的事情。我在规范中遗漏了这一点-如果你可以发布一个链接,我会将其标记为答案。你确定你想要/需要一个具有联合继承的超级实体吗?这将导致严重的速度减慢,尤其是在@OneToMany/@ManyToMany关系上。@MicheleMariotti那么用例是这样的:假设ID是URL的一部分。servlet事先不知道在必须获取它时引用了什么类。它可能是BaseObject或某个子类。一旦有了它,我们就可以简单地将instanceof用于它需要的任何逻辑,以提供适当的响应。所以,是的,我认为我们确实需要指定的行为。好吧,如果这是你的要求,我认为你是对的,别无选择。即使使用纯SQL也无法找到更好的方法……当您这样做时会发生什么?当我使用DataNucleus JPA执行此操作时,我得到了正确的类型。。。i、 e可以是子类。就像JPA一样spec@NeilStockton我的应用程序有问题,所以我还没有测试。但即使它起作用,我也希望确保我没有做依赖于实现的事情。我在规范中遗漏了这一点-如果你可以发布一个链接,我会将其标记为答案。你确定你想要/需要一个具有联合继承的超级实体吗?这将导致严重的速度减慢,尤其是在@OneToMany/@ManyToMany关系上。@MicheleMariotti那么用例是这样的:假设ID是URL的一部分。servlet事先不知道在必须获取它时引用了什么类。它可能是BaseObject或某个子类。一旦有了它,我们就可以简单地将instanceof用于它需要的任何逻辑,以提供适当的响应。所以,是的,我认为我们确实需要指定的行为。好吧,如果这是你的要求,我认为你是对的,别无选择。即使使用纯SQL也没有更好的方法。。。