我有下表
+---------------------------------------+
| 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
我怎么能做到这一点?
答案 0 :(得分:0)
我知道使用注释执行此操作的唯一方法可能是利用特定于Hibernate的@Filter
和@FilterDef
来根据代理列表中的状态应用过滤器。
一种可移植的方法是简单地使List<Country> agencies
成为业务逻辑在获取Company
实体后填充的瞬态列表。您的抓取可以同时使用所需的user_id
和company_parent
限制,而无需担心映射。
当字段是瞬态的并且访问它就好像它是由hibernate映射的属性一样,您可以在开发的稍后阶段轻松采用复合键更改,并简单地删除额外的提取以支持映射更改。从业务代码开始,它应该像使用瞬态方法一样运行。