Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.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
Java 如何使用JPA-EntityGraph仅加载entity@Basic属性的子集?_Java_Hibernate_Jpa_Wildfly_Jpa 2.1 - Fatal编程技术网

Java 如何使用JPA-EntityGraph仅加载entity@Basic属性的子集?

Java 如何使用JPA-EntityGraph仅加载entity@Basic属性的子集?,java,hibernate,jpa,wildfly,jpa-2.1,Java,Hibernate,Jpa,Wildfly,Jpa 2.1,我发现这是关于实体图的。。。读过之后,我想到了可以使用实体图来检索给定实体的@Basic字段的子集(到目前为止,我一直使用实体图来检索关系,例如,加载员工[包括其所有属性]及其关联部门[包括其所有属性]) 因此,我决定尝试使用一个小测试: @Entity @Table(name = "employee") @NamedEntityGraphs({ @NamedEntityGraph( name = "OnlyName", attributeNodes =

我发现这是关于实体图的。。。读过之后,我想到了可以使用实体图来检索给定实体的
@Basic
字段的子集(到目前为止,我一直使用实体图来检索关系,例如,加载员工[包括其所有属性]及其关联部门[包括其所有属性])

因此,我决定尝试使用一个小测试:

@Entity
@Table(name = "employee")
@NamedEntityGraphs({
    @NamedEntityGraph(
        name = "OnlyName",
        attributeNodes = @NamedAttributeNode(value = "name")
    )
})
public class Employee implements Serializable {
    ...
    @Id
    @Column(name = "code", updatable = false)
    private Long code;

    @Basic(fetch = FetchType.LAZY)
    @Column(name = "name", nullable = false)
    private String name;

    @Basic(fetch = FetchType.LAZY)
    @Column(name = "last_name", nullable = false)
    private String lastName;

    @Lob @Basic(fetch = FetchType.LAZY)
    @Column(name = "picture", nullable = false)
    private byte[] picture;

    public Employee() {
       super();
    }
    ...
}
然后,为了检索我的实体,我使用了以下代码:

    private Employee retrieveFromDatabase(long code) {
        EntityGraph<Employee> graph;                // Material Entity Graph

        Map<String, Object> map = new HashMap<>();

        graph = (EntityGraph<Employee>) this.em.createEntityGraph("OnlyName");
        map.put("javax.persistence.fetchgraph", graph);


        return this.em.find(Employee.class, code, map);
    }
private Employee retrieve from数据库(长代码){
EntityGraph;//材质实体图
Map Map=newhashmap();
graph=(EntityGraph)this.em.createEntityGraph(“OnlyName”);
put(“javax.persistence.fetchgraph”,graph);
返回此.em.find(Employee.class、code、map);
}
现在,这段代码总是返回一个Employee,其中包含从数据库中获取的所有字段;甚至Hibernate日志也显示了一个选择所有员工字段的查询:

Hibernate:选择employee0。代码为code1\u 0\u,employee0\u。姓氏为姓氏2\u 0\u 0,employee0\u。名称为name3\u 0\u,employee0\u。图片为图片4\u 0\u来自employee0\u,其中employee0\u。代码=?

当我期待这样的查询时:
select employee0.code作为code1\u0\u0,employee0\u0.name作为name3\u0\u0来自employee0,其中employee0.code=?

那么,我做错了什么?此功能不是由Hibernate提供的吗

注意:在测试中,我使用了hibernate 5.0.10和wildfly10


谢谢

事实上,你没有做错什么。然而,您缺少了一条重要的信息。在第2.3.2节中,我们发现:

fetch
-FetchType(默认为
EAGER

定义此属性是应立即获取还是延迟获取。JPA说,对于提供者(Hibernate)来说,在获取所有者时应该获取值是一个要求,而LAZY只是在访问属性时获取值的一个提示Hibernate忽略基本类型的此设置,除非您使用字节码增强。有关获取和字节码增强的更多信息,请参阅

因此:即使您向
em.find(…)
方法提供了查询提示,但还是由JPA提供者(这里是Hibernate)决定是否急切地获取基本属性。在您的情况下,
员工
实体仅包含
@Basic
属性

有关参考,以及更详细的上下文和解释,请参见此。它涵盖了
“javax.persistence.fetchgraph”
“javax.persistence.loadgraph”
查询提示之间的差异,并有示例代码演示JPA持久性提供程序Hibernate的上述行为

旁注:我查过了

  • 。。Hibernate ORM用户指南和:所有版本都包含关于默认策略的相同语句,以忽略基本属性
  • 。。官员。在(PDF)第117页第3.7.4节中,我们发现: 允许持久性提供程序在fetch graph或load graph指定的之外获取额外的实体状态

JPA规范中的后一段引用支持ORM用户指南,即这样实现是可以的

我的忠告是:

查看Hibernate ORM用户指南(见上文)中所述的字节码增强


希望有帮助。

谢谢您的回答。。。我希望在将来,hibernate能够完全实现这个特性。。。您是否知道其他jpa实现遵守指定的获取计划?