在Hibernate中映射层次结构数据

时间:2018-12-17 20:15:33

标签: java oracle hibernate jpa

在一个Hibernate应用程序中,我们正在处理一个带有分层数据的表(Oracle数据库)。

为简单起见,我将举一个有父亲的人的例子(假设等级不固定,范围可以超过3个级别)。

每个人都可能拥有一辆车(也许有几辆车)。

@Entity
class Person
{
 @Id
 private String id;
 @ManyToOne
 @JoinColumn(name = "FATHER_ID")
 private Person father;
}

@Entity
class Car
{
 @Id
 private String id;
 @ManyToOne
 private Person owner;
}

到目前为止,每当我们需要获取一个人的后代的所有汽车时,我们都会发出一个本机查询,以获取所有后代的ID,然后发出第二个hql查询来获取汽车本身(使用IN子句,将先前获取的ID作为绑定参数)。

我不喜欢它,因为它弄脏了我们的代码并导致我们发出超出实际需要的查询。

此外,我们还是在滥用IN子句,对许多查询使用不同数量的绑定参数。

所以我决定尝试使用Hibernate封装此分层数据。

我尝试使用@JoinFormula来使该人的后代成为数据成员,如下所示:

@Entity
class Person 
{
  ...
  @JoinFormula(value = "SELECT p.id FROM Person p START WITH p.id = id CONNECT BY PRIOR p.id = father_id", referencedColumnName = "id")
  @OneToMany
  List<Person> descendants;
}

不幸的是,它不起作用,休眠会抛出异常:

ClassCastException: org.hibernate.mapping.Formula cannot be cast to org.hibernate.mapping.Column

我尝试将与@ManyToMany的关系更改为,它修复了ClassCastException,但随后休眠只是忽略了公式并创建了一个新表。

我现在正在考虑使用sql函数检索后代ID,并在我的hql中使用它。 但是我不太确定该怎么做...

任何帮助将不胜感激!

0 个答案:

没有答案