从同一个表中的两列连接表

时间:2016-01-10 01:20:13

标签: hibernate hibernate-mapping

我有下表

+---------------------------------------+
|                 Company               |
+------+-------+--------------+---------+
|  id  |user_id|company_parent|   name  |
+------+-------+--------------+---------+
| COIE |   1   |     null     | company |
+------+-------+--------------+---------+
| AGCY |   1   |     COIE     |  agency |
+------+-------+--------------+---------+
| COIE |   2   |     null     | company |
+------+-------+--------------+---------+

基本上每个公司都有一组代理商,每个代理商都有一个母公司(如果母公司为空,则为company_parent列的值),id和user_id都是主键,但在我的映射中我只宣布id为@id(因为我后来将user_id添加为主键,并且用复合键添加新类非常痛苦)

所以我想使用user_id列和company_parent列为每个公司创建一个子列表以获取其相关代理。 这是我目前的映射:

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

@OneToMany(mappedBy = "parentCompany")
@NotFound(action = NotFoundAction.IGNORE)
private List<Company> agencies;

此映射存在的问题是不考虑user_id。 我试过这个:

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

但我明白了:wrong number of column. should be 1 我怎么能做到这一点?

1 个答案:

答案 0 :(得分:0)

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

一种可移植的方法是简单地使List<Country> agencies成为业务逻辑在获取Company实体后填充的瞬态列表。您的抓取可以同时使用所需的user_idcompany_parent限制,而无需担心映射。

当字段是瞬态的并且访问它就好像它是由hibernate映射的属性一样,您可以在开发的稍后阶段轻松采用复合键更改,并简单地删除额外的提取以支持映射更改。从业务代码开始,它应该像使用瞬态方法一样运行。