使用来自同一个表的两个外键进行休眠 - 注释
Posted
技术标签:
【中文标题】使用来自同一个表的两个外键进行休眠 - 注释【英文标题】:Hibernate with two foreign keys from same table- annotation 【发布时间】:2014-05-22 04:43:42 【问题描述】:我正在尝试设计一款款待应用。我有两个表User
和Request
。用户可以是Host
或Visitor
,可以互相发送主机请求。但是没有必要将用户定义为访问者或主机,这对系统无关紧要,所以我没有单独的表格供他们使用。这种差异在 Request 表中很重要,需要将 visitor_id
和 host_id
保留为外键(与 User 表中的 user_id
主键列映射,因为主机和访问者也是用户)。
我的问题是如何在休眠中使用Annotation
定义这种关系?我的意思是,Request 表中应该有两个外键,它们映射到 User 表中的 *user_id* 主键列。每个用户都可以多次成为主持人或访客,并且不提出或提出多次请求。
@Entity
public class Request
@Id
private Long req_id;
....
【问题讨论】:
【参考方案1】:一个请求是针对主机和来自访问者的,因此您只需从请求到用户有 2 个多对一关联:
@Entity
public class Request
@Id
@Column(name = "req_id")
private Long id;
@ManyToOne
@JoinColumn(name = "visitor_id")
private User visitor;
@ManyToOne
@JoinColumn(name = "host_id")
private User host;
// ...
如果你想让这些关联是双向的,那么你只需要在用户中对应的集合:
@Entity
private class User
/**
* requests made to this user, in order for this user to be a host
*/
@OneToMany(mappedBy = "host")
private Set<Request> hostRequests = new HashSet<>();
/**
* requests made by this user, in order for this user to be a visitor
*/
@OneToMany(mappedBy = "visitor")
private Set<Request> visitorRequests = new HashSet<>();
// ...
【讨论】:
嗨,我有类似的休眠表。它工作正常,我面临杰克逊前向和后向引用的问题。就像杰克逊只引用一列一样,如果我犯了其他 500 个错误 如何使用带内连接的 HQL 查询它们?由于 hql 内连接中不存在“ON”子句? @user1735921 在这种情况下您不需要 ON(尽管它确实存在于 HQL 中)。阅读文档。整个部分专门用于 HQL 中的联接。以上是关于使用来自同一个表的两个外键进行休眠 - 注释的主要内容,如果未能解决你的问题,请参考以下文章
休眠多对一注释外键 javax.el.ELException