ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java – 仅从类层次结构中检索超类

2019-07-04 03:48:38  阅读:162  来源: 互联网

标签:java jpa hibernate class-hierarchy


我有一个场景如下:

@Entity
@Table(name = "ANIMAL")
@Inheritance(strategy = InheritanceType.JOINED)

public class Animal implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "S_ANIMAL")
    @SequenceGenerator(name = "S_ANIMAL", sequenceName = "S_ANIMAL", allocationSize = 1)
    public int getNumero() {
        return numero;
    }

    public void setNumero(int numero) {
        this.numero = numero;
    }
        .
        .
        .
}

并作为子类:

@Entity
@Table(name = "DOG")
public class Dog extends Animal {

    private static final long serialVersionUID = -7341592543130659641L;
        .
        .
        .
}

我有一个像这样的JPA Select语句:

SELECT a FROM Animal a;

我正在使用Hibernate 3.3.1

我可以看到框架使用左外连接检索Animal和Dog的实例.

有没有办法只选择“部分”动物?我的意思是,之前的Select会得到所有的动物,那些只是动物而不是狗,而那些是狗.

我想要他们所有,但在狗的情况下,我想只检索他们的“动物部分”.

我找到了@ org.hibernate.annotations.Entity(polymorphism = PolymorphismType.EXPLICIT)
但正如我所看到的,只有当Animal不是@Entity时才有效.

非常感谢.

解决方法:

简短回答:您描述的行为符合JPA标准.没有JPA标准方法来限制JPA提供程序仅检索超类.

提供者可以选择查询实现逻辑来实现功能,一致性和性能.只要它尊重您的实体注释并在查询中返回所请求的信息,一切都很好.将Dog的外部联接视为私有实现细节,不应该与您有关.提供程序已编写外部联接以协助性能和一致性.

考虑:

> JPA被定义为处理java对象实体而不是表
>您的实体层次结构Root的根不是抽象的,因此您可以创建一个实例并将其保留.
>您有一个Animal @DescriminatorColumn和@DescriminatorType的默认值 – 因此Animal表将添加一个名为“DTYPE”的标识符列并键入“some String type”.您有@DescriminatorValue的默认值 – 将等于实体名称:Animal.创建此实体时,Animal.DTYPE column =“Animal”.
>实体狗有一个超类动物.默认值也用于其@DescriminatorValue – Dog.因此,当您创建此实体时,Animal.DTYPE column =“Dog”.
> Java类限制确保每当Dog对象存在时,也存在相应的Animal超类对象.
>通常,当您将实体动物加载到JPA持久性上下文中时,使用@DescriminatorValue(值存储在DTYPE列中)=“Dog”,然后将Dog对象加载到PC中以保持一致性非常有用.即使JPA标准不要求它.
>继承关系不能指定为EAGER或LAZY(如基本类型字段或实体关系字段).如果你需要读取/更新狗属性并且没有加载Dog类,你会怎么做?运行单独的查询来重新加载它?这会大大损害一致性和性能.
>性能的主要关注点是发送到DB的单独SQL命令的总数.
在时间方面:
使用动物表查询只比动物外部加入狗的查询稍快(10秒微秒???),但比两个单独的查询(一个用于动物,一个用于狗)快得多

标签:java,jpa,hibernate,class-hierarchy
来源: https://codeday.me/bug/20190704/1373298.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有