使用来自同一个表的两个外键进行休眠 - 注释

Posted

技术标签:

【中文标题】使用来自同一个表的两个外键进行休眠 - 注释【英文标题】:Hibernate with two foreign keys from same table- annotation 【发布时间】:2014-05-22 04:43:42 【问题描述】:

我正在尝试设计一款款待应用。我有两个表UserRequest。用户可以是HostVisitor,可以互相发送主机请求。但是没有必要将用户定义为访问者或主机,这对系统无关紧要,所以我没有单独的表格供他们使用。这种差异在 Request 表中很重要,需要将 visitor_idhost_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 中的联接。

以上是关于使用来自同一个表的两个外键进行休眠 - 注释的主要内容,如果未能解决你的问题,请参考以下文章

JPA休眠两个外键到同一个表

休眠多对一注释外键 javax.el.E​​LException

hibernate:使用注释的完全连接

如何使用注释创建休眠复合键

休眠。如何将条目添加到具有来自 Hibernate 中 2 个不同表的 2 个外键的表中?

oracle建表的时候同时创建主键,外键,注释,约束,索引