[英]JPA 2.1 NamedSubgraph in Hibernate ignoring subclasses
我正在使用Hibernate 4.3.8.FINAL並且具有以下模型,其中Department有許多Employees,Employee可以是Manager。
員工實體:
@Entity
@Table(name = "employee", schema = "payroll")
@Inheritance(strategy = InheritanceType.JOINED)
public class Employee
{
@Id
private Long id;
@Basic(optional = false)
@Column(name = "name")
private String name;
@JoinColumn(name = "department_id", referencedColumnName = "id")
@ManyToOne(optional = false, fetch = FetchType.LAZY)
private Department department;
}
經理實體:
@Entity
@Table(name = "manager", schema = "payroll")
@Inheritance(strategy = InheritanceType.JOINED)
@PrimaryKeyJoinColumn(name = "employee_id", referencedColumnName = "id")
public class Manager extends Employee
{
@Basic(optional = false)
@Column(name = "car_allowance")
private boolean carAllowance;
}
部門實體:
@NamedEntityGraph(
name = "Graph.Department.FetchManagers",
includeAllAttributes = false,
attributeNodes = {
@NamedAttributeNode(value = "name"),
@NamedAttributeNode(value = "employees", subgraph = "FetchManagers.Subgraph.Managers")
},
subgraphs = {
@NamedSubgraph(
name = "FetchManagers.Subgraph.Managers",
type = Employee.class,
attributeNodes = {
@NamedAttributeNode(value = "name")
}
),
@NamedSubgraph(
name = "FetchManagers.Subgraph.Managers",
type = Manager.class,
attributeNodes = {
@NamedAttributeNode(value = "carAllowance"),
}
)
}
)
@Entity
@Table(name = "department", schema = "payroll")
public class Department
{
@Id
private Long id;
@Basic(optional = false)
@Column(name = "name")
private String name;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "department", fetch = FetchType.LAZY)
private Set<Employee> employees;
}
如部門實體所示,我正在嘗試創建一個加載所有員工的@NamedSubgraph,並且還要獲取Manager.carAllowance。 但是我收到以下錯誤:
Unable to locate Attribute with the the given name [carAllowance] on this ManagedType [com.nemea.hydra.model.test.Employee]
根據我的理解,@ NamedSubgraph.type應該用於指定要獲取的實體子類屬性。 是否有可能Hibernate忽略了@NamedSubgraph注釋的type = Manager.class屬性,或者我錯過了什么?
這可能是休眠4.3.8.FINAL的缺陷,如如的EclipseLink 2.5.1不拋出異常時, subgraphs
屬性被使用。
無論如何,當你在Manager
類型的情況下指定subclassSubgraphs
而不是subclass
時它應該工作,即:
@NamedEntityGraph(
name = "Graph.Department.FetchManagers",
includeAllAttributes = false,
attributeNodes = {
@NamedAttributeNode(value = "name"),
@NamedAttributeNode(value = "employees", subgraph = "FetchManagers.Subgraph.Managers")
},
subgraphs = {
@NamedSubgraph(
name = "FetchManagers.Subgraph.Managers",
type = Employee.class,
attributeNodes = {
@NamedAttributeNode(value = "name")
}
)
},
subclassSubgraphs = {
@NamedSubgraph(
name = "FetchManagers.Subgraph.Managers",
type = Manager.class,
attributeNodes = {
@NamedAttributeNode(value = "carAllowance"),
}
)
}
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.