Car*_*Way 5 java hibernate jpa wildfly jpa-2.1
我找到了有关实体图的文档...阅读后,它让我想到您可以使用实体图仅检索@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();
}
...
}
Run Code Online (Sandbox Code Playgroud)
然后,为了检索我的实体,我使用了以下代码:
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);
}
Run Code Online (Sandbox Code Playgroud)
现在,这段代码总是返回一个包含从数据库中获取的所有字段的 Employee ;甚至 Hibernate 日志也显示了一个选择所有员工字段的查询:
Hibernate: select employee0_.code as code1_0_0_, employee0_.last_name as last_name2_0_0_, employee0_.name as name3_0_0_, employee0_.picture as picture4_0_0_ from employee employee0_ where employee0_.code=?
)
当我期待这样的查询时: select employee0_.code as code1_0_0_, mployee0_.name as name3_0_0_ from employee employee0_ where employee0_.code=?
那么,我做错了什么?Hibernate不支持这个功能吗??
注意:为了测试,我使用了 hibernate 5.0.10 和 wildfly10 ...
谢谢!
事实上,你没有做错任何事。然而,您遗漏了Hibernate ORM 用户指南 (v5.0.x) 中的一条重要信息。在 2.3.2 节中,我们发现:
fetch- FetchType(默认为EAGER)定义是否应急切或延迟获取此属性。JPA 说 EAGER 是对提供者(Hibernate)的一个要求,即在获取所有者时应该获取值,而 LAZY 只是暗示在访问属性时获取值。除非您使用字节码增强,否则Hibernate 会忽略基本类型的此设置。有关获取和字节码增强的其他信息,请参阅BytecodeEnhancement。
所以:即使您向该em.find(..)方法提供查询提示,也取决于 JPA 提供者 - 此处:Hibernate - 决定是否会急切地获取基本属性。在您的情况下,Employee实体仅包含@Basic属性。
作为参考,有关更多上下文以及更详细的解释,另请参阅本教程。它涵盖了查询提示"javax.persistence.fetchgraph"和"javax.persistence.loadgraph"查询提示之间的差异,并提供了演示 JPA 持久性提供程序 Hibernate 的上述行为的示例代码。
旁注:我检查过..
允许持久性提供者获取超出获取图或加载图指定的其他实体状态。
来自 JPA 规范的后一个引用支持ORM 用户指南,以这种方式实现它是可以的。
我的建议:
查看Hibernate ORM 用户指南(见上文)中所述的BytecodeEnhancement。
希望能帮助到你。