Hibernate 通过同一表中的两列连接表

Hibernate 通过同一表中的两列连接表,hibernate,hibernate-mapping,Hibernate,Hibernate Mapping,我有下表 +---------------------------------------+ | Company | +------+-------+--------------+---------+ | id |user_id|company_parent| name | +------+-------+--------------+---------+ | COIE | 1 | null | com

我有下表

+---------------------------------------+
|                 Company               |
+------+-------+--------------+---------+
|  id  |user_id|company_parent|   name  |
+------+-------+--------------+---------+
| COIE |   1   |     null     | company |
+------+-------+--------------+---------+
| AGCY |   1   |     COIE     |  agency |
+------+-------+--------------+---------+
| COIE |   2   |     null     | company |
+------+-------+--------------+---------+
基本上,每个公司都有一组代理,每个代理都有一个母公司(如果母公司为空,则company\u parent列的值),id和user\u id都是主键,但在我的映射中,我只宣布id为@id(因为我后来添加了user_id作为主键,而使用复合键添加新类真的很痛苦)

因此,我想为每个公司创建一个子列表,以获取其相关机构,同时使用user\u id列和company\u parent列。 以下是我当前的映射:

@ManyToOne
@JoinColumn(name = "company_parent")
@NotFound(action = NotFoundAction.IGNORE)
private Company parentCompany;

@OneToMany(mappedBy = "parentCompany")
@NotFound(action = NotFoundAction.IGNORE)
private List<Company> agencies;
但是我得到:
列的编号错误。应该是1

我如何才能做到这一点?

我所知道的对注释执行此操作的唯一方法可能是利用特定于Hibernate的
@Filter
@FilterDef
来根据代理列表上的状态应用过滤器

一种可移植的方法是简单地将
列表机构
制作成一个临时列表,在获取
公司
实体后,您的业务逻辑将填充该临时列表。您的获取可以使用所需的
用户id
公司父级
限制,而无需担心映射

由于字段是暂时的,并且访问它就像它是hibernate映射的属性一样,您可以在开发的后期轻松地采用复合键更改,并简单地删除额外的获取以支持映射更改。从业务代码中,它应该像使用暂时方法一样进行操作

@ManyToOne
@JoinColumns({
    @JoinColumn(name = "company_parent"), 
    @JoinColumn(name = "user")
})
@NotFound(action = NotFoundAction.IGNORE)
private Company parentCompany;