Hibernate 中的 JPA 2.1 NamedSubgraph 忽略嵌套子图

2024-05-03

我正在使用 Hibernate 4.3.8.FINAL 并具有以下模型,其中一个部门有许多员工,并且员工可以是经理。 Manager 有一组 Foo,可以是 Foo 也可以是 Bar。

员工实体:

@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;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "manager", fetch = FetchType.LAZY)
    private Set<Foo> fooSet;
}

Foo 实体:

@Entity
@Table(name = "foo", schema = "payroll")
@Inheritance(strategy = InheritanceType.JOINED)
public class Foo
{
    @Id
    private Long id;

    @Basic(optional = false)
    @Column(name = "name")
    private String name;

    @JoinColumn(name = "manager_id", referencedColumnName = "id")
    @ManyToOne(fetch = FetchType.LAZY)
    private Manager manager;
}

酒吧实体:

@Entity
@Table(name = "bar", schema = "payroll")
@Inheritance(strategy = InheritanceType.JOINED)
@PrimaryKeyJoinColumn(name = "foo_id", referencedColumnName = "id")
public class Bar extends Foo
{
    @Basic(optional = false)
    @Column(name = "name")
    private Long size;
}

部门实体:

@NamedEntityGraph(
        name = "Graph.Department.Employees",
        includeAllAttributes = false,
        attributeNodes = {
                @NamedAttributeNode(value = "name"),
                @NamedAttributeNode(value = "employees", subgraph = "FetchManagers.Subgraph.Employees")
        },
        subgraphs = {
                @NamedSubgraph(
                        name = "FetchManagers.Subgraph.Employees",
                        type = Employee.class,
                        attributeNodes = {
                                @NamedAttributeNode(value = "name")
                        }
                ),
                @NamedSubgraph(
                        name = "FetchManagers.Subgraph.FooBar",
                        type = Foo.class,
                        attributeNodes = {
                                @NamedAttributeNode(value = "name")
                        }
                )
        },
        subclassSubgraphs = {
                @NamedSubgraph(
                        name = "FetchManagers.Subgraph.Employees",
                        type = Manager.class,
                        attributeNodes = {
                                @NamedAttributeNode(value = "carAllowance"),
                                @NamedAttributeNode(value = "fooSet", subgraph = "FetchManagers.Subgraph.FooBar")
                        }
                ),
                @NamedSubgraph(
                        name = "FetchManagers.Subgraph.FooBar",
                        type = Bar.class,
                        attributeNodes = {
                                @NamedAttributeNode(value = "size")
                        }
                )
        }
)
@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;
}

如 Department 实体所示,我尝试使用另一个子图 FetchManagers.Subgraph.FooBar 加载 Manager 的 fooSet。然而,这似乎被完全忽略,并且生成的查询不与 foo 或 bar 表连接(参见下面的查询)。

SELECT department0_.id AS id1_153_0_,
       employees1_.id AS id1_154_1_,
       department0_.name AS name2_153_0_,
       employees1_.department_id AS departme3_154_1_,
       employees1_.name AS name2_154_1_,
       employees1_1_.car_allowance AS car_allo1_156_1_,
       CASE
           WHEN employees1_1_.employee_id IS NOT NULL THEN 1
           WHEN employees1_.id IS NOT NULL THEN 0
       END AS clazz_1_,
       employees1_.department_id AS departme3_153_0__,
       employees1_.id AS id1_154_0__
FROM payroll.department department0_
LEFT OUTER JOIN payroll.employee employees1_ ON department0_.id=employees1_.department_id
LEFT OUTER JOIN payroll.manager employees1_1_ ON employees1_.id=employees1_1_.employee_id
WHERE department0_.id=?

是否支持这种类型的嵌套子图?或者我错过了什么?


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Hibernate 中的 JPA 2.1 NamedSubgraph 忽略嵌套子图 的相关文章

随机推荐