2014-04-09 42 views
5

我试图设计一个款待应用程序。我有两张表格UserRequest。用户可以是HostVisitor,并可以向对方发送主机请求。但没有必要将用户定义为访问者或主机,这对系统无关紧要,所以我没有为他们设置单独的表格。这种差异在Request表中非常重要,需要将visitor_idhost_id保留为外键(因为主机和访问者都是User,因此与用户表的user_id主键列映射)。休眠时使用来自同一表格注释的两个外键

我的问题是我怎样才能在休眠与Annotation定义这种关系?我的意思是,Request表中应该有两个外键,它们映射到User表的* user_id *主键列。每个用户可以多次成为主机或访问者,并且没有任何请求或许多请求。

@Entity 
public class Request { 
@Id 
private Long req_id; 

.... 

} 

回答

8

的请求是一台主机,并从游客,所以你只需要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<>(); 

    // ... 
} 
+0

嗨,我有类似的类与休眠表。它运行良好,我面临杰克逊向前和向后引用的问题。像在杰克逊只有一个专栏被引用,如果我让其他500个错误来到 –