【问题标题】:JPA/Hibernate map @OneToMany for Oracle hierarchical data用于 Oracle 分层数据的 JPA/Hibernate 映射 @OneToMany
【发布时间】:2015-04-15 03:28:59
【问题描述】:

假设我在表组织中有父子信息,如下所示:

id name parent_id
1  A    1
2  A1   1
3  A2   1
4  A11  2

使用 Oracle,我可以使用“开始于/连接方式”获取组织的所有后代或祖先。比如下面的sql会获取“A”下的所有子树都包含自己(即A、A1、A2、A11)

select * from Organization start with id=1 connect by nocycle prior id=parent_id;

或者这个sql会得到A11的所有祖先,包括它自己(即A11,A1,A)

with o_hier as (select o.id, o.parent_id, CONNECT_BY_ISCYCLE as lvl from Organization o start with id=4 connect by nocycle prior parent_id = id) select o.* from Organization o, o_hier where o.id = o_hier.id union all select o.* from Organization o, o_hier where o.id = o_hier.parent_id and o_hier.lvl = 1;

现在我想像这样将该表映射到 OrganizationEntity:

@Entity
@Table(name = "Organization")
public class OrganizationEntity {

    //getter/setter omitted for readability

    @Id
    @Column(name = "ID")
    private String id;

    @Column(name = "NAME")
    private String name;

    @ManyToOne(fetch = FetchType.LAZY)
    @???
    List<OrganizationEntity> descendants = new ArrayList<>();

    @ManyToOne(fetch = FetchType.LAZY)
    @???
    List<OrganizationEntity> ancestors= new ArrayList<>();
}

我知道可能存在性能问题,但我们可以使用 Hibernate/JPA 映射类似的东西吗?

【问题讨论】:

    标签: oracle hibernate jpa one-to-many hierarchical


    【解决方案1】:

    这是一个棘手的问题。您可以使用标准的父子映射。

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "ID")
    OrganizationEntity parent;
    
    @OneToMany(fetch = FetchType.LAZY)
    @mappedBy(mappedBy="parent")
    List<OrganizationEntity> childern;
    

    然后使用标准的树遍历算法来获取所有祖先(简单的 while 循环)或所有后代(一些 DFS 变体,通常是预排序)。

    明智地执行此伤口非常缓慢。

    其他更好的想法是使用 CONNECT BY 在数据库中进行遍历,然后将结果集映射到对象。您可以使用纯 JPA callsHibernate specific calls 来做到这一点。

    【讨论】:

    • 我有兴趣像您的第二个想法一样在 Oracle 中进行递归调用,但似乎无法让 JoinColumnsOrFormula 和/或 JoinFormula, JoinColumn 让它工作。这里有任何黑带 Hibernate/JPA 吗?
    • @LuanNguyen 只使用本机 SQL 查询,如 here (pure JPA)here (hibernate specific) 所述。我会更新我的答案。
    • 它可以作为查询完成,但我对仅使用映射的解决方案感兴趣。
    猜你喜欢
    • 1970-01-01
    • 2019-02-24
    • 2012-05-09
    • 1970-01-01
    • 2020-04-15
    • 1970-01-01
    • 2014-11-19
    • 1970-01-01
    • 2023-03-04
    相关资源
    最近更新 更多